问题描述
错误代码如下所示,d1中的s指针和a1中的s指针会指向同一块内存,然后释放时会double free。
#include <vector>
#include <cstring>
#include <memory>
using namespace std;
class Demo {
public:
Demo() {
s = new char[32];
strcpy(s, "hello world");
}
~Demo() {
if (s != nullptr) {
delete[]s;
}
}
char *s;
};
int main() {
Demo d1;
vector<Demo> a1;
a1.push_back(d1);
}
解决方法1
添加拷贝构造函数和赋值构造函数,对与新对象,new新的内存空间,让新对象的s指针指向新的空间。
Demo(const Demo &other){
auto m = new char[32];
memcpy(m, other.s, 32);
}
Demo &operator=(const Demo &other){
auto m = new char[32];
if(this != &other){
memcpy(m, other.s, 32);
}
return *this;
}
解决方法2
删除析构函数,在构造函数中使用shared_ptr管理数组空间。
Demo() {
shared_ptr<char> p(new char[32]);
s = p.get();
strcpy(s, "hello world");
}
解决方法3
使用share_ptr 管理Demo的对象。
shared_ptr<Demo> d1_ptr(new Demo);
vector<shared_ptr<Demo>> a1;
a1.push_back(d1_ptr);
本文探讨了C++中由于指针管理不当导致的Double Free问题,通过一个错误代码示例展示了问题所在。文章提出了三种解决方案:1) 实现拷贝构造函数和赋值构造函数以正确复制对象;2) 使用`shared_ptr`管理数组内存,避免手动释放;3) 利用`shared_ptr`管理`Demo`对象,确保智能指针负责对象生命周期。这三种方法都旨在确保内存的正确分配和释放,防止内存泄漏和Double Free错误。
6万+

被折叠的 条评论
为什么被折叠?



