C++ Boost智能指针和非POD类型(C+;+;)
在使用智能指针进行实践并了解它们如何通过RAII防止内存泄漏和帮助内存管理时,我做了以下工作:C++ Boost智能指针和非POD类型(C+;+;),c++,memory,pointers,boost,smart-pointers,C++,Memory,Pointers,Boost,Smart Pointers,在使用智能指针进行实践并了解它们如何通过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() {
#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;
}
我可以从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 );
}
shared\u ptr a;
int*b;
myobj(){
b=新整数[50];
boost::detail::sp_从这个(a、b、b)中启用共享_;
}
它返回了以下错误:
warning: cannot pass objects of non-POD type ‘class boost::shared_ptr<int>’ through ‘...’; call will abort at runtime
警告:无法通过“…”传递非POD类型的“类boost::shared_ptr”对象;调用将在运行时中止
我不太明白。您不能将分配了
new int[50]
的内容分配给共享\u ptr
,除非您还提供了一个执行delete[]
而不是delete
的自定义删除程序
enable\u shared\u from\u此
旨在为类类型添加检索所属共享指针的功能,您刚刚从详细信息
命名空间中提取了一些内容。这不是为了直接使用而设计的。它被设计成这样使用
class myobj : public boost::enable_shared_from_this<myobj>
{ //...
class myobj:public boost::从\u中启用\u共享\u
{ //...
最简单的数组管理容器是
std::vector
,而不是shared\u ptr您不能将new int[50]
分配的内容分配给shared\u ptr
,除非您还提供了一个执行delete[]
而不是delete
的自定义删除程序
enable\u shared\u from\u此
旨在为类类型添加检索所属共享指针的功能,您刚刚从详细信息
命名空间中提取了一些内容。它不是直接使用的。它是这样设计的
class myobj : public boost::enable_shared_from_this<myobj>
{ //...
class myobj:public boost::从\u中启用\u共享\u
{ //...
最简单的数组管理容器应该是std::vector
,而不是shared\u ptr
对于初学者来说,您调用的函数位于detail
命名空间中,这意味着它可能不会被直接调用。这可能与您的问题有关
对于您遇到的特定错误,该错误通常意味着您试图调用传递非POD参数的varargs函数。在这种情况下,这是因为boost::shared_ptr
不是POD类型。我认为这与使用数组和原始指针无关;我认为您只是用e错误的参数。您是否打算使用此
中的boost::shared\u?对于初学者,您正在调用的函数位于详细信息
命名空间中,这意味着它可能不打算直接调用。这可能与您的问题有关
对于您遇到的特定错误,该错误通常意味着您试图调用传递非POD参数的varargs函数。在这种情况下,这是因为boost::shared_ptr
不是POD类型。我认为这与使用数组和原始指针无关;我认为您只是用e错误的参数。您是想使用此
中的boost::shared\u吗?首先,boost::detail
中的任何内容都是实现细节。除非您正在开发将成为boost本身一部分的代码,否则不要触摸它
第二,Boo::SyddypTr> /Cord>不能直接封装数组。这是因为C++中的数组必须用“代码>删除”删除。
,而boost::shared_ptr
则改为使用delete
进行删除。可以改为使用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>());
模板
结构数组删除器{
void运算符()(T*p){
删除[]p;
}
};
//后来。。。
boost::shared_ptr p(new int[50],array_deleter());
但是,请不要这样做。请使用共享\u数组
或共享\u ptr
至于你为什么不能这么做:
boost::shared_ptr<int> a;
// later
a = new int;
boost::shared_ptr a;
//后来
a=新整数;
这是因为太容易使某个内容成为共享\u ptr是危险的-请记住,如果将某个内容变成共享\u ptr两次,则最终会将其双重释放。因此,共享\u ptr将只通过其构造函数获取原始指针。如果确实要用原始指针覆盖共享\u ptr,则有一种方法:
a.swap(boost::shared_ptr<int>(new int));
a.swap(boost::shared_ptr(newint));
这将创建一个新指针,然后将其与
a
交换。然后释放临时智能指针(使用a
的旧值)。首先,boost::detail
中的任何内容都是实现细节。除非您正在开发将成为boost本身一部分的代码,否则不要触摸它
第二,
则改为使用boost::shared_ptr
进行删除。可以改为使用delete
到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>());
模板
结构数组删除器{
void运算符()(T*p){
删除[]p;
}
};
//后来。。。
boost::shared_ptr p(new int[50],array_deleter());
但是,请不要这样做。请使用共享\u数组
或共享\u ptr
至于你为什么不能这么做:
boost::shared_ptr<int> a;
// later
a = new int;
boost::shared_ptr a;
//后来
a=新整数;
这是因为太容易使某个东西成为共享的\u ptr是危险的-记住,如果你让某个东西成为共享的\u ptr两次,你最终会加倍释放它。所以共享的\u ptr只会通过它们的构造函数获取原始指针。如果