2011-03-30 45 views
4

在我的應用程序,我創建了一個char*這樣的:如何在C++中刪除char *?

class sample 
{ 
    public: 
     char *thread; 
}; 

sample::sample() 
{ 
    thread = new char[10]; 
} 

sample::~sample() 
{ 
    delete []thread; 
} 

我在代碼做正確的事?

+0

爲什麼'[]線程'而不是'刪除線程;'只? – mauris 2011-03-30 03:24:03

+1

你的意思是'thread = new char [10]'? – sth 2011-03-30 03:25:15

+0

@thephpdeveloper因爲他想刪除線程「指向」的數據。線程之前的*表示它的一個指針。指針線程在超出範圍時將被「刪除」。 – Pete 2011-03-30 03:26:02

回答

13

點名單要注意:

1)您需要爲n個字符,其中n是字符串中的字符數,再加上房間後空字節分配房間。

2)然後,您將線程更改爲指向不同的字符串。因此,您必須對使用new[]創建的變量使用delete[]函數。

但是爲什麼你會爲newdelete爲角色數據鬼混?爲什麼不使用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作爲字符串數據。

+5

不要在'std :: string'中使用'strlen()'。使用'.size()'成員函數 - 即使字符串嵌入了空字符,它也能正常工作。作爲額外的獎勵,它是O(1)! – bdonlan 2011-03-30 03:36:42

+0

但不是std :: string通常不是線程安全的「http://stackoverflow.com/questions/1661154/c-stdstring-in-a-multi-threaded-program」所以它取決於他的要求使用char *或std :: string。 – user258367 2011-03-30 05:11:05

+1

@ user258367:最糟糕的情況是,你必須通過'const char * string :: c_str()'和'string ::'來複制一個'std :: string'來抑制多線程代碼中的COW。字符串(const char *,size_t)'來消除COW。仍然比100%手動字符串處理更安全。 – MSalters 2011-03-30 16:21:15

2

這是「正確的」*,但它是非常錯誤的。

您不應使用new[],而應使用std::vector<char>std::string。即使你沒有這樣做,你需要尊重rule of three,或者你的班級壞了。

*假設你的意思是new char[10]。另外,更正統的是delete[] thread

14

如果您在new之後有[],您需要在delete之後[]。你的代碼看起來正確。

1

雖然它與內存管理無關,但還有一點需要注意。如果你要定義sample::samplesample::~sample,你首先必須聲明它們,讓你的類定義應該是這個樣子:

class sample 
{ 
    public: 
     char *thread; 
     sample(); 
     ~sample(); 
}; 

正如@GMan說,雖然,你真的不應該這樣做在所有...

+0

這是我在代碼中做的事情......我只是單單提到我的核心邏輯。 – karthik 2011-03-30 03:41:35