[英]How to use std::shared_ptr as class member?
我需要创建一个这样的类。 但是,当我运行此代码时,我得到:
"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中
在您的情况下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[]>());
另请注意:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.