我需要创建这样的类。但是当我运行此代码时,我会得到:
"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;
}
请,看看std :: make_shared如何工作。
基本上, std :: make_shared
构造T型的对象并将其包装在std :: shared_ptr
在您的情况下将其包装在A std :: shared_ptr 中。结果,为单个 int 分配了内存,而不是为 int s的数组,您的程序导致 undfined行为。。
我想您可以使用std :: Default_delete来避免问题:
_arr = std::shared_ptr<int>(new int[size], std::default_delete<int[]>());
还请注意,
- 您的 operator = 什么都没有返回。
- 您不应该使用下划线开始变量名称。
- 无需在类destructor中为 _arr 调用 reset()。