c++ - 为什么在正确释放内存时会出现内存泄漏?
问题描述
这就是分配和释放的所有代码
构造函数
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;
}
}
解决方案
这个功能
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;
}
}
推荐阅读
- oracle - 加入多个表并仅获取最新数据(Oracle)
- r - 为什么在 apply() 和 sapply() 中使用 is.factor() 返回不同的值?
- c# - 分割序列
- angular - 用秋田实现基本抽象状态的适当方法
- javascript - 当复选框选中值为真时,不显示显示文本
- pandas - 我不能在循环中使用 RandomForest?
- xslt - 如何将循环中的值与 Xslt 中的条件相加
- reactjs - 如何检测项目中的哪个依赖项使用代理来激活 React Native Hermes
- php - PHP 从原始 tcp 套接字读取数据并使用 2 React 连接器通过 WebSocket 客户端发送它们
- sql - 不使用 GROUP BY 但在选择列表中变得无效,因为它不包含在聚合函数或 GROUP BY 子句中