-3

我有这堂课:

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在我的析构函数中声明,我的程序会出现内存泄漏吗?

4

7 回答 7

10

绝对没有理由在new这里使用。构造函数获取 astd::string然后手动将其内容复制到一个新的动态分配数组中char。这是完全没有价值的。相反,如果构造函数只是将它复制到另一个std::string中,则std::string复制构造函数也会这样做,但有很多免费的好处:异常安全、没有内存泄漏正确的复制语义

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) {}
于 2012-06-11T15:46:46.637 回答
5

您的问题是delete在使用new[]. 它需要delete[] message正确释放字符串。

将指针设置为 NULL 只是掩盖了问题,并且确实泄漏了内存。

于 2012-06-11T15:43:30.233 回答
2

存在内存泄漏您分配了一个char数组,因此您需要适当地删除它,如下所示:

Base::~Base(){
     delete[] message;  
}

如果将指针设置为 NULL 则无关紧要,指针本身在调用析构函数后无论如何都会被释放。

于 2012-06-11T15:44:48.903 回答
1

使用此处显示的代码,没有内存泄漏。但是,NULL在任何情况下,对指针的影响都不会删除它。你只是失去了对它的引用。

于 2012-06-11T15:29:58.483 回答
1

是的,如果您没有在构造函数中delete动态分配内存,那就是内存泄漏。new

你必须使用delete[] message

于 2012-06-11T15:42:38.383 回答
1

你为什么要使用delete?您不是在堆上分配内存,您只是在创建一个指针。但是,除非您在构造函数的堆上分配内存,考虑到您选择不共享代码,我们无法知道...

于 2012-06-11T15:33:38.117 回答
1

存在内存泄漏,因为只需执行 message = NULL,您只会使指针的地址无效。保存在内存中的内容仍然存在,没有被删除。

于 2012-06-11T16:06:59.277 回答