我正在使用auto_ptr<>
它使用类指针类型的数组,所以我如何为其赋值。
例如
auto_ptr<class*> arr[10];
如何为arr
数组赋值?
您不能将 auto_ptr 与数组一起使用,因为它调用delete p
,而不是delete [] p
。
你想要boost::scoped_array或其他一些 boost::smart_array :)
如果您有 C++0x(例如 MSVC10、GCC >= 4.3),我强烈建议您使用 astd::vector<T>
或 astd::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; }
正如大家在这里所说,不要将数组与 auto_ptr 混合使用。仅当您有多个返回时您觉得很难释放内存,或者当您从其他地方获得分配的指针并且您有责任在存在函数之前清理它时,才必须使用此方法。
另一件事是,在 auto_ptr 的析构函数中,它使用存储的指针调用删除运算符。现在您传递的是数组的单个元素。内存管理器将尝试查找并释放从您传递的地址开始分配的内存块。可能这可能不是维护所有分配的现有堆。在此操作中,您可能会遇到未定义的行为,例如崩溃、内存损坏等。
数组,auto_ptr<>
不要混合。
从GotW 网站:
每个都
delete
必须匹配其new
. 如果使用单对象new,则必须使用单对象delete;如果使用new的数组形式,则必须使用delete的数组形式。否则会产生未定义的行为。
我不会逐字复制 GotW 网站。但是,我将总结您解决问题的选项:
滚动您自己的自动阵列
1a。派生自 auto_ptr。优点不多,太难了。
1b。克隆 auto_ptr 代码。易于实施,没有显着的空间/开销。难以维护。
所以底线是使用 avector<>
而不是 C 样式的数组。