这是c ++中的代码内存泄漏?

时间:2012-06-11 15:28:15

标签: c++ memory-leaks

我有这堂课:

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,我的程序是否会出现内存泄漏?

7 个答案:

答案 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,您就只能取消指针的地址。内存中保存的内容仍然存在且尚未删除。