作者final01 (牛顿运动定律)
看板C_and_CPP
标题[问题] C++ "double free or corruption"
时间Sat Nov 12 13:13:00 2016
开发平台(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):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.164.62.170
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1478927582.A.A3B.html
※ 编辑: final01 (1.164.62.170), 11/12/2016 13:14:50
1F:→ johnjohnlin: 对,你要 copy class 的 pointer 11/12 13:59
2F:→ pttworld: Mystring B(A.getPtr()); 11/12 14:32
3F:推 flyfoxy: 建议判断指标非空再delete 11/12 14:32
4F:推 lovejomi: delete nullptr并不会怎样 11/12 14:34
5F:→ jlearthday: b与a有相同的记忆体空间被释放了 11/12 15:25
6F:推 jaw109: 因为default copy constructor 11/12 18:52
7F:→ jaw109: 把A.ptr给了B.ptr,等於A.ptr和B.ptr指到同一位址 11/12 18:53
8F:→ jaw109: 当A和B要执行destructor的时候就变成同一个ptr被free两次 11/12 18:55
9F:推 steve1012: 为什麽要判断非空在delete? 建议所有delete後面都要把 11/12 23:12
10F:→ steve1012: 指标指向null 避免未定义行为很难debug 11/12 23:12
11F:→ shadow0326: \shared ptr/ 11/12 23:25
感谢~我大概知道原因了~
这篇也有说明
http://www.learncpp.com/cpp-tutorial/915-shallow-vs-deep-copying/
※ 编辑: final01 (1.164.62.170), 11/13/2016 00:07:59