[問題] C++ "double free or corruption"

作者: final01 (牛頓運動定律)   2016-11-12 13:13:00
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC 4.9
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
NO
問題(Question):
最近練習C++,不知道為何執行時會得到錯誤訊息
"double free or corruption"
看不太出來為何會執行錯誤~
經過實驗好像是因為少了copy constructor
可是想不出來為何會有這種錯誤跟如何解釋
有人能跟我說真正的原因嘛??真的是因為少了copy constructor嘛??
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
class Mystring
{
private:
char *ptr;
public:
Mystring(const char *s);
Mystring();
~Mystring();
};
Mystring::~Mystring()
{
delete []ptr;
}
Mystring::Mystring()
{
ptr = new char[1];
ptr[0] = '\0';
}
Mystring::Mystring(const char *s)
{
int len = strlen(s);
ptr = new char[len+1];
strcpy(ptr,s);
ptr[len+1] = '\0';
}
int main(int argc, char **argv)
{
Mystring A;
Mystring B = A;
return 0;
}
餵入的資料(Input):
預期的正確結果(Expected Output):
沒有錯誤訊息
錯誤結果(Wrong Output):
double free or corruption
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
作者: johnjohnlin (嗯?)   2016-11-12 13:59:00
對,你要 copy class 的 pointer
作者: pttworld (批踢踢世界)   2016-11-12 14:32:00
Mystring B(A.getPtr());
作者: flyfoxy (飛狐)   2016-11-12 14:32:00
建議判斷指標非空再delete
作者: lovejomi (JOMI)   2016-11-12 14:34:00
delete nullptr並不會怎樣
作者: jlearthday (希望我簡單聰明善良體貼)   2016-11-12 15:25:00
b與a有相同的記憶體空間被釋放了
作者: jaw109   2016-11-12 18:52:00
因為default copy constructor把A.ptr給了B.ptr,等於A.ptr和B.ptr指到同一位址當A和B要執行destructor的時候就變成同一個ptr被free兩次
作者: steve1012 (steve)   2016-11-12 23:12:00
為什麼要判斷非空在delete? 建議所有delete後面都要把指標指向null 避免未定義行為很難debug
作者: shadow0326 (非議)   2016-11-12 23:25:00
\shared ptr/

Links booklink

Contact Us: admin [ a t ] ucptt.com