我需要创建一个这样的类。但是,当我运行此代码时,我得到:
"Error in `./a.out': free(): invalid next size (fast)"
MyClass有什么问题?如何正确使用shared_ptr作为类成员?
#include <memory>
class MyClass
{
public:
MyClass(unsigned size) {
_size = size;
_arr = std::make_shared<int>(size);
for (int i = 0; i < size; i++)
_arr.get()[i] = 0;
}
MyClass(const MyClass& other) {
_arr = other._arr;
_size = other._size;
}
MyClass& operator=(const MyClass& other) {
_arr = other._arr;
_size = other._size;
}
void setArr(std::shared_ptr<int> arr, unsigned size) {
_size = size;
_arr = arr;
}
~MyClass() {
_arr.reset();
}
private:
std::shared_ptr<int> _arr;
unsigned _size;
};
int main() {
MyClass m(4);
return 0;
}
谢谢,我误解了make_shared的含义。如果我想使用int *(不是std :: vector或std :: array),我应该写这个吗? (并且不要修复其他方法)
MyClass(unsigned size) {
_size = size;
_arr = std::shared_ptr<int>(new int[size]);
for (int i = 0; i < size; i++)
_arr.get()[i] = 0;
}
答案 0 :(得分:3)
请查看std::make_shared的工作原理。
基本上, std :: make_shared
构造一个T类型的对象并将其包装在std :: shared_ptr
中
在你的情况下 T 是 int ,所以 std :: make_shared 创建了一个 int 类型的对象,将它包装在 std :: shared_ptr 中。因此,内存分配给单个 int ,而不是 int 的数组,并且您的程序会导致 Undefined Behavior 。
我想您可以使用std::default_delete来避免问题:
_arr = std::shared_ptr<int>(new int[size], std::default_delete<int[]>());
另请注意: