C++ Boost智能指针和非POD类型(C+;+;)

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() {

在使用智能指针进行实践并了解它们如何通过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;
}
我可以从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本身一部分的代码,否则不要触摸它

第二,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只会通过它们的构造函数获取原始指针。如果