问题描述
错误代码如下所示,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);