在我的應用程序,我創建了一個char*
這樣的:如何在C++中刪除char *?
class sample
{
public:
char *thread;
};
sample::sample()
{
thread = new char[10];
}
sample::~sample()
{
delete []thread;
}
我在代碼做正確的事?
在我的應用程序,我創建了一個char*
這樣的:如何在C++中刪除char *?
class sample
{
public:
char *thread;
};
sample::sample()
{
thread = new char[10];
}
sample::~sample()
{
delete []thread;
}
我在代碼做正確的事?
點名單要注意:
1)您需要爲n個字符,其中n是字符串中的字符數,再加上房間後空字節分配房間。
2)然後,您將線程更改爲指向不同的字符串。因此,您必須對使用new[]
創建的變量使用delete[]
函數。
但是爲什麼你會爲new
和delete
爲角色數據鬼混?爲什麼不使用std::string
而不是'C'功能?
#include <cstdio>
#include <string>
int countWords(const char *p);
int main(int argc, char *argv[])
{
std::string pString = "The Quick Brown Fox!";
int numWords1 = countWords(pString.c_str());
printf("\n\n%d words are in the string %s", numWords1, pString.c_str());
int numWords2 = countWords(argv[1]);
printf("\n%d words are in the string %s", numWords2, argv[1]);
}
無需new[]
,delete[]
,strcpy()
等
使用strlen()
:爲什麼有這麼多不這樣做最簡單的事情這是驚人的。更好的是,不要使用char*
並使用std::string
作爲字符串數據。
不要在'std :: string'中使用'strlen()'。使用'.size()'成員函數 - 即使字符串嵌入了空字符,它也能正常工作。作爲額外的獎勵,它是O(1)! – bdonlan 2011-03-30 03:36:42
但不是std :: string通常不是線程安全的「http://stackoverflow.com/questions/1661154/c-stdstring-in-a-multi-threaded-program」所以它取決於他的要求使用char *或std :: string。 – user258367 2011-03-30 05:11:05
@ user258367:最糟糕的情況是,你必須通過'const char * string :: c_str()'和'string ::'來複制一個'std :: string'來抑制多線程代碼中的COW。字符串(const char *,size_t)'來消除COW。仍然比100%手動字符串處理更安全。 – MSalters 2011-03-30 16:21:15
這是「正確的」*,但它是非常錯誤的。
您不應使用new[]
,而應使用std::vector<char>
或std::string
。即使你沒有這樣做,你需要尊重rule of three,或者你的班級壞了。
*假設你的意思是new char[10]
。另外,更正統的是delete[] thread
。
如果您在new
之後有[]
,您需要在delete
之後[]
。你的代碼看起來正確。
雖然它與內存管理無關,但還有一點需要注意。如果你要定義sample::sample
和sample::~sample
,你首先必須聲明它們,讓你的類定義應該是這個樣子:
class sample
{
public:
char *thread;
sample();
~sample();
};
正如@GMan說,雖然,你真的不應該這樣做在所有...
這是我在代碼中做的事情......我只是單單提到我的核心邏輯。 – karthik 2011-03-30 03:41:35
爲什麼'[]線程'而不是'刪除線程;'只? – mauris 2011-03-30 03:24:03
你的意思是'thread = new char [10]'? – sth 2011-03-30 03:25:15
@thephpdeveloper因爲他想刪除線程「指向」的數據。線程之前的*表示它的一個指針。指針線程在超出範圍時將被「刪除」。 – Pete 2011-03-30 03:26:02