在练习智能指针并了解它们如何通过 RAII 防止内存泄漏和帮助内存管理时,我做了以下事情:
#include <boost/shared_ptr.hpp>
#include <vector>
#include <iostream>
using std::cout;
using boost::shared_ptr;
class myobj {
public:
shared_ptr<int> a;
myobj() {
shared_ptr<int> b(new int[50]);
a = b;
}
~myobj() {}
};
typedef boost::shared_ptr<myobj> myobj_ptr;
int main() {
for (unsigned int i=0; i < 5000000; i++) {
myobj *foo = new myobj();
myobj *bar = new myobj();
myobj_ptr bar_ptr(bar);
bar_ptr = myobj_ptr(foo);
bar = foo;
}
return 0;
}
我有什么办法可以做类似的事情(希望我的目标出现在“伪”代码中):
a = new int[50];
我可以从 Boost shared_ptr.hpp 文件本身看出为什么这不起作用,但我不明白为什么这在那时不起作用:
shared_ptr<int> a;
int *b;
myobj() {
b = new int[50];
boost::detail::sp_enable_shared_from_this( a, b, b );
}
它返回了这个错误:
warning: cannot pass objects of non-POD type ‘class boost::shared_ptr<int>’ through ‘...’; call will abort at runtime
我不太明白。
最佳答案
首先,boost::detail
中的任何内容是一个实现细节。除非您正在开发将成为 boost 本身一部分的代码,否则请勿触摸它。
第二,boost::shared_ptr
不能直接包装数组。这是因为 C++ 中的数组必须用 delete []
删除。 , 而 boost::shared_ptr
用 delete
删除反而。使用 boost::shared_array
相反,或者可能是 boost::shared_ptr
到 std::vector
.如果你真的必须使用 shared_ptr
对于数组,您必须使用自定义删除器创建它:
template <typename T>
struct array_deleter {
void operator()(T *p) {
delete [] p;
}
};
// later...
boost::shared_ptr<int> p(new int[50], array_deleter<int>());
但是请不要真的这样做。使用 shared_array<int>
或 shared_ptr<vector<int> >
.
至于为什么你不能这样做:
boost::shared_ptr<int> a;
// later
a = new int;
这是因为让一些东西变得太容易成为 shared_ptr 是危险的 - 请记住,如果你两次将某个东西变成 shared_ptr,你最终会双重释放它。所以 shared_ptrs 只会通过它们的构造函数获取原始指针。如果你真的想用原始指针覆盖 shared_ptr,这里有一种方法:
a.swap(boost::shared_ptr<int>(new int));
这会创建一个新指针,然后将其与 a
交换.然后释放临时智能指针(带有 a
的旧值)。
关于c++ - Boost 智能指针和非 POD 类型 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836500/