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

标签 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() {
        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_ptrdelete 删除反而。使用 boost::shared_array 相反,或者可能是 boost::shared_ptrstd::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/

相关文章:

c - malloc和指针代码演示

c - 如何将字符串转换为 int 或 float 类型?

c++ - 线程在 pthread_rwlock_t 中挂起

C++/CX ^ 与 &

c++ - 为什么 Qt 不应用这个样式表类型选择器?

c++ - 获取文件的完整路径给定其 "Reference Number"

c# - 通过 ref - 内存占用在堆栈上传递 'value type'

c++ - C++ 结构 vector 的内存布局

java - 优化启动画面内存

c - 多维数组,不同方式表示grid[22][0]的地址