我有这堂课:
class Base{
private:
char *message;
public:
Base(string message`);
~Base();
};
编辑:抱歉,我忘了给我的建设者! 当我实现如下的析构函数时:
Base::Base(string message1){
message = new char[message1.size() + 1]
message[message1.size()] = '\0';
memcpy(message, message1.c_str(), message.size());
}
Base::~Base(){
delete message;
}
有时系统出现stop working
错误,但如果不使用delete message
,我会使用message = NULL
,一切都会好起来的!所以,如果我只是在析构函数中声明message = NULL
,我的程序是否会出现内存泄漏?
答案 0 :(得分:10)
这里绝对没有理由使用new
。构造函数接受std::string
,然后手动将其内容复制到新的动态分配的char
数组中。这完全没有价值。相反,构造函数只是将其复制到另一个std::string
中,std::string
复制构造函数也会这样做,但有很多免费的好处:异常安全,no memory leaks和{{3 }}
class Base{
private:
string message;
public:
Base(string message);
// maybe a virtual destructor is desirable if this is a polymorphic base class
// virtual ~Base() {}
};
Base::Base(string message1) : message(message1) {}
答案 1 :(得分:5)
问题在于使用delete
创建的内容使用new[]
。需要delete[] message
才能正确释放字符串。
将指针设置为NULL只会掩盖问题,会泄漏内存。
答案 2 :(得分:2)
内存泄漏。您分配了一个char
数组,因此您需要适当地删除它,如下所示:
Base::~Base(){
delete[] message;
}
如果将指针设置为NULL是无关紧要的,那么在调用析构函数后,指针本身就会被解除分配。
答案 3 :(得分:1)
使用此处显示的代码,没有内存泄漏。但是,在任何情况下,将NULL
影响到指针都不会将其删除。你只是松开了对它的引用。
答案 4 :(得分:1)
为什么要使用delete
?你没有在堆上分配内存,你只是创建一个指针。除非你在构造函数中在堆上分配内存,我们无法知道你选择不共享代码...
答案 5 :(得分:1)
是的,如果您没有delete
构造函数中new
动态分配的内存,则会导致内存泄漏。
您必须使用delete[] message
答案 6 :(得分:1)
存在内存泄漏,因为只需执行message = NULL,您就只能取消指针的地址。内存中保存的内容仍然存在且尚未删除。