2013-04-30 50 views
1

我該如何定義我需要調用「delete []」作爲指針還是不是我的類的析構函數? 指針(成員變量)可指向堆中分配的緩衝區或不在不同時間(它可以是隻讀內存中的文字或放置在堆棧中的文字)。 解決問題的最佳方法是什麼? 我是否需要使用另一個標誌,或者可能會得到堆邊界的地址並檢查它們之間的緩衝區地址? 還是有更合理的方法?定義放置c字符串的位置

+1

如果你的指針指向字符數據,您可以通過使用'的std :: string'而不是避免整個問題'char *'。 – 2013-04-30 15:13:26

+0

但我使用它來進行套接字數據傳輸,並且一個緩衝區可以保存字符數據(以ASCII格式命令),而在另一個時間只能保存字節數據。 – SerG 2013-04-30 15:19:44

+0

優秀!這聽起來像'std :: string'是要走的路。 – 2013-04-30 15:31:18

回答

2

你不能告訴,如果一個指針自動存儲,靜態存儲器或動態存儲器中,只需查看指針即可。你需要存儲一個標誌的時候,當你設置的指針 - 例如,像這樣的:

class classWithDynamicData { 
private: 
    bool needToDelete; 
    char strData[]; 
public: 
    classWithDynamicData(int size) : needToDelete(true), strData(new char[size]) { 
    } 
    classWithDynamicData(char* data) : needToDelete(false), strData(data) { 
    } 
    ~classWithDynamicData() { 
     if (needToDelete) delete[] strData; 
    } 
    ... 
    // You need to define a copy constructor and an assignment operator 
    // to avoid violating the rule of three 
}; 
+0

沒有直接關係,但是這個解決方案違反了[Rule of Three](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))。 – 2013-04-30 15:14:55

+0

@Robᵩ好點! – dasblinkenlight 2013-04-30 15:16:03

2
  1. 不要使用動態分配的成員(使用std::string代替char *std::vector,而不是動態分配的數據成員)或
  2. 使用智能指針
+0

改用std :: string來處理動態分配。這裏不需要(智能)指針。 – Aleph 2013-04-30 15:20:13

+0

@AnotherTest:真的,但OP沒有說他正在使用'char *',所以它只是你的猜測。 – 2013-04-30 15:22:40

+0

啊所有的答案似乎都是關於'char *',這可能讓我想到這一點。你應該在回答中添加「如果可能的話使用標準容器」(如果你想要upvote;))。 – Aleph 2013-04-30 15:24:46

相關問題