【发布时间】:2012-07-26 19:00:50
【问题描述】:
我有以下代码,但不确定为什么在遇到 Myclass 的析构函数时会收到堆损坏检测错误。我相信我正在正确地释放内存??
#include <iostream>
#include <vector>
using namespace std;
class MyClass{
private:
char* mp_str;
public:
MyClass():mp_str(NULL){}
~MyClass(){
delete [] mp_str;
}
void setString(const char* str);
void printString();
};
int main(){
MyClass* a = new MyClass();
std::vector<MyClass> myVector;
myVector.push_back(*a);
a->setString("Hello World");
myVector[0].setString("Goodbye world");
a->printString();
myVector[0].printString();
return 1;
}
void MyClass::setString(const char* const str){
if(!str)
return;
size_t len = strlen(str);
if(!this->mp_str){
this->mp_str = new char[len];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}
void MyClass::printString(){
if(this->mp_str)
cout << mp_str;
else
cout << "No string found";
}
编辑:(固定代码)
void MyClass::setString(const char* const str){
if(!str)
return;
size_t len = strlen(str);
if(!this->mp_str){
this->mp_str = new char[len+1];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}
在main()中,我也加了
delete a;
调用return 1之前;
【问题讨论】:
-
@yurikilochek:同意。解决了这个问题。
-
@user315052:是的,我知道
a的副本被推送到向量上,我需要在这里进行深层复制。我应该遵循三法则。但是,代码不应抛出此类错误。拉斐尔的回答帮我指出了错误! -
@brainydexter:如果我确定这是您崩溃的根本原因,我会发布一个答案。作为评论,它表示您应该遵循的建议(因为如果不修复,以后会导致类似的挠头)。问候
-
@user315052 感谢您发布链接(因此 +1 :) 并引导我朝着正确的方向前进。我意识到这里发生的浅拷贝应该被修复。在我继续这样做之前,我在想,为什么这该死的东西会在我身上哭泣和崩溃。 :) 一个 len+1 让我到了那里!不过,谢谢!
标签: c++ memory memory-leaks