15

我正在使用auto_ptr<>它使用类指针类型的数组,所以我如何为其赋值。

例如 auto_ptr<class*> arr[10];

如何为arr数组赋值?

4

4 回答 4

17

您不能将 auto_ptr 与数组一起使用,因为它调用delete p,而不是delete [] p

你想要boost::scoped_array或其他一些 boost::smart_array :)

于 2011-06-29T12:48:00.163 回答
3

如果您有 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; }
于 2011-06-29T14:40:09.390 回答
1

正如大家在这里所说,不要将数组与 auto_ptr 混合使用。仅当您有多个返回时您觉得很难释放内存,或者当您从其他地方获得分配的指针并且您有责任在存在函数之前清理它时,才必须使用此方法。

另一件事是,在 auto_ptr 的析构函数中,它使用存储的指针调用删除运算符。现在您传递的是数组的单个元素。内存管理器将尝试查找并释放从您传递的地址开始分配的内存块。可能这可能不是维护所有分配的现有堆。在此操作中,您可能会遇到未定义的行为,例如崩溃、内存损坏等。

于 2011-06-29T13:45:39.300 回答
1

数组,auto_ptr<> 不要混合

GotW 网站

每个都delete必须匹配其new. 如果使用单对象new,则必须使用单对象delete;如果使用new的数组形式,则必须使用delete的数组形式。否则会产生未定义的行为。

我不会逐字复制 GotW 网站。但是,我将总结您解决问题的选项:

  1. 滚动您自己的自动阵列

    1a。派生自 auto_ptr。优点不多,太难了。

    1b。克隆 auto_ptr 代码。易于实施,没有显着的空间/开销。难以维护。

  2. 使用适配器模式易于实施,难以使用、维护和理解。花费更多时间/开销。
  3. 将 auto_ptr 替换为手动编码的 EH 逻辑。易于使用,没有显着的空间/时间/开销。难以实施、阅读、易碎。
  4. 使用向量<> 而不是数组。易于实现,易于阅读,不那么脆弱,没有显着的空间、时间和开销。需要进行语法更改,有时还会更改可用性。

所以底线是使用 avector<>而不是 C 样式的数组。

于 2011-06-29T13:00:20.290 回答