c++ - 运算符(+)连接字符数组中的文本导致内存泄漏
问题描述
我有一个包含operator + ()
要添加 2 个对象的类。该类包含一个属性char *
变量str
,该变量指向一个分配的char
数组,new char[]
该数组包含一个 C 样式的文本字符串。我希望将operator +()
两个char
数组连接到第三个char
数组中,该数组分配为一个新的缓冲区,该缓冲区的大小可以包含连接的字符串作为运算符的结果。
我正在使用重载的构造函数和初始化列表,并将变量初始化为默认值。我添加到类中的析构函数释放了为char *str
变量中的对象文本缓冲区分配的内存。
没有类析构函数,一切都很好,但是一旦我添加了析构函数,程序就会打印出奇怪的字符。我也看到内存泄漏。
这是代码,请注意这里包含类析构函数!
#include <iostream>
#include <cstring>
#include<cstring>
class Mystring {
private:
char *str;
public:
Mystring():
str{nullptr} {
str = new char[1];
*str = '\0';
}
Mystring(const char *s):
str {nullptr} {
if (s==nullptr) {
str = new char[1];
*str = '\0';
} else {
str = new char[std::strlen(s)+1];
std::strcpy(str, s);
}
}
Mystring(const Mystring &source):
str{nullptr} {
str = new char[std::strlen(source.str)+ 1];
std::strcpy(str, source.str);
std::cout << "Copy constructor used" << std::endl;
}
~Mystring(){
delete [] str;
}
void print() const{
std::cout << str << " : " << get_length() << std::endl;
}
int get_length() const{
return std::strlen(str);
}
const char *get_str() const{
return str;
}
Mystring&operator+(const Mystring &dstr)const;
};
// Concatenation
Mystring &Mystring::operator+(const Mystring &dstr)const {
char *buff = new char[std::strlen(str) + std::strlen(dstr.str) + 1];
std::strcpy(buff, str);
std::strcat(buff, dstr.str);
Mystring temp {buff};
delete [] buff;
return temp;
}
int main() {
Mystring m{"Kevin "};
Mystring m2{"is a stooge."};
Mystring m3;
m3=m+m2;
m3.print();
return 0;
}
解决方案
Mystring &Mystring::operator+(const Mystring &dstr)const
这表明它将返回对MyString
Your temp 的引用,但它是本地的。这会导致比内存泄漏更严重的问题。
一旦您按价值返回;你会发现它最终可能想要使用复制或移动构造函数;这导致(如评论中所述)3规则(或5规则)。
推荐阅读
- node.js - 如何用 sinon 编写单元测试用例并点击而不打到数据库?
- javascript - 如何更改 ESRI 地图中点的颜色?
- jquery - 如何修复此正则表达式以排除负数
- qt - 如何将鼠标位置转换为行号?
- set - 如何使用具有“通常”相等性的 MSet 创建有限集类型?
- react-native - 如何在反应原生中像ibook一样翻转页面过渡
- firefox-addon - 如何指定下载管理器以保存到最后使用的目录?
- javascript - 如何使用另一个函数删除 DataTable 属性?
- c# - 如何在类型也具有泛型参数的情况下使用泛型队列?
- django - 如何通过 Python3 Django 将通过注册页面创建的用户存储到 Google Cloud MySQL 数据库?