首页 > 解决方案 > 为什么在正确释放内存时会出现内存泄漏?

问题描述

这就是分配和释放的所有代码

构造函数

 Event::Event(){
    setEmpty();
}

析构函数

    Event::~Event(){
    delete [] event_description;
}

复制构造函数

Event::Event(const Event& Event){
      if (Event.event_description == nullptr) {
          event_description = nullptr;

      } else {
           event_description = new char[strlen(Event.event_description)+1];
          strcpy(event_description, Event.event_description);

      }
    time_in_sec = Event.time_in_sec;
}

复制赋值运算符

Event& Event::operator=(const Event& Event){
    delete [] event_description;
    if (Event.event_description == nullptr) {
        event_description = nullptr;

    } else {
         event_description = new char[strlen(Event.event_description)+1];
        strcpy(event_description, Event.event_description);
    }


 time_in_sec = Event.time_in_sec;

    return *this;
}

在进一步开发中设置描述的功能。 主要任务是为事件描述动态分配内存。通过 valgrind 检查时出现内存泄漏

void Event::setDescription(const char* new_desc){
    if (new_desc == nullptr || new_desc[0] == '\0') {

        event_description = nullptr;
        time_in_sec = 0;
    } else {
        event_description = new char[strlen(new_desc)+1];
        strcpy(event_description, new_desc);
        time_in_sec = g_sysClock;
    }
}

标签: c++memory-leaksnew-operatordynamic-memory-allocationdelete-operator

解决方案


这个功能

void Event::setDescription(const char* new_desc){
    if (new_desc == nullptr || new_desc[0] == '\0') {

        event_description = nullptr;
        time_in_sec = 0;
    } else {
        event_description = new char[strlen(new_desc)+1];
        strcpy(event_description, new_desc);
        time_in_sec = g_sysClock;
    }
}

产生内存泄漏。它不会删除先前分配的内存,其地址存储在数据成员 event_description 中。

它至少应该被定义为

void Event::setDescription(const char* new_desc){
    delete [] event_description;   

    if (new_desc == nullptr || new_desc[0] == '\0') {
        event_description = nullptr;
        time_in_sec = 0;
    } else {
        event_description = new char[strlen(new_desc)+1];
        strcpy(event_description, new_desc);
        time_in_sec = g_sysClock;
    }
}

更安全的方法看起来像

void Event::setDescription(const char* new_desc){
    if (new_desc == nullptr || new_desc[0] == '\0') {
        delete [] event_description;   
        event_description = nullptr;
        time_in_sec = 0;
    } else {
        char *tmp = new char[strlen(new_desc)+1];
        delete [] event_description;
        event_description = tmp;
        strcpy(event_description, new_desc);
        time_in_sec = g_sysClock;
    }
}

推荐阅读