我正在使用auto_ptr<>
,它使用类指针类型的数组,所以我该如何为它赋值。
e.g。
auto_ptr<class*> arr[10];
如何为arr
数组指定值?
答案 0 :(得分:17)
您不能将auto_ptr与数组一起使用,因为它会调用delete p
,而不是delete [] p
。
你想要boost::scoped_array或其他一些boost :: smart_array:)
答案 1 :(得分:3)
如果您有C ++ 0x(例如MSVC10,GCC&gt; = 4.3),我强烈建议您使用std::vector<T>
或std::array<T, n>
作为基础对象类型(取决于无论大小是固定的还是变量的),如果你在堆上分配这个人并需要传递它,请把它放在std::shared_ptr
:
typedef std::array<T, n> mybox_t;
typedef std::shared_ptr<mybox_t> mybox_p;
mybox_p makeBox() { auto bp = std::make_shared<mybox_t>(...); ...; return bp; }
答案 2 :(得分:1)
数组和auto_ptr<>
不混合。
来自GotW site:
每个
delete
必须符合以下形式 它的new
。如果使用单个对象 新的,你必须使用单个对象 删除;如果你使用数组形式 新的,你必须使用数组形式 删除。否则产生收益 未定义的行为。
我不打算逐字复制GotW网站;但是,我将总结您解决问题的方法:
滚动您自己的自动数组
1a上。从auto_ptr派生。 很少有优点,太难了。
1b中。克隆auto_ptr代码。 易于实施,没有显着的空间/开销。难以维护。
所以底线是使用vector<>
而不是C风格的数组。
答案 3 :(得分:1)
正如大家所说,不要将数组与auto_ptr混合使用。只有在你觉得很难释放内存的多次返回时,或者当你从其他地方获得一个分配的指针并且你有责任在现有函数之前清理它时,才能使用它。
另一件事是,在auto_ptr的析构函数中,它使用存储的指针调用delete运算符。现在你传递的是一个数组的单个元素。内存管理器将尝试查找并释放从您传递的地址开始分配的内存块。可能这可能不是维持所有分配的现有堆。在此操作中,您可能会遇到未定义的行为,如崩溃,内存损坏等。