c++ - 为什么 C++ 中 auto_ptr 的二维 vector 不起作用?

标签 c++ c++11

我正在研究一个二维 vector ( vector 的 vector )来携带 C++ 中的一些指针。

std::vector< std::vector<object*> > data;

这里的对象是一个类,每个数据条目都携带一个指向对象实例的指针。我让它在 C++ 中工作,但是当我将其应用于其他代码时,内存管理使其难以维护。我做了一些研究,有人建议使用智能指针。我尝试下面的代码

  #include <vector>
  #include <memory>
  using namespace std;
  
  int main(void) {
    vector< int > source = {1,2,3,4,5};
    vector< auto_ptr<int> > co;
    vector< vector< auto_ptr<int> > > all;

    co.push_back( auto_ptr<int>(&source[0]) );
    co.push_back( auto_ptr<int>(&source[2]) );
    co.push_back( auto_ptr<int>(&source[4]) ); // it works well up to here

    all.push_back(co); // but it crashs here
    return 0;
  }

错误消息之一是

C:/msys64/mingw64/include/c++/9.2.0/bits/STL_construct.h:75:7: 错误: 没有匹配的函数用于调用 'std::auto_ptr::auto_ptr(const std::auto_ptr& )' 75 | 75 {::new(static_cast(__p)) _T1(std::forward<_Args>(__args)...); } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

我想知道如何添加 vector< auto_ptr<int> >到另一个 vector 或列表?

最佳答案

首先,不要使用std::auto_ptr。正如您所发现的,它不能用作 vector 的元素,因为它没有适当的复制构造函数。自 C++11 起,它已被弃用,取而代之的是使用 std::unique_ptr。 std::auto_ptr 已从 C++17 中的语言中删除。

其次,&source[i] 指向的对象归source 所有。这些对象不属于该表达式生成的原始指针,甚至没有办法转移其所有权。因此,您不能将它们的所有权交给智能指针。如果这样做,一旦这些智能指针被销毁,程序的行为将变得不确定。

如果你想要一个智能指针 vector 的 vector ,这是一个正确的例子:

std::vector<std::unique_ptr<int>> co;
std::vector<std::vector<std::unique_ptr<int>>> all;
for (auto i : source) {
    co.push_back(std::make_unique<int>(i));
}
all.push_back(std::move(co));

额外提示:

  • 除非需要交换行,否则使用一维 vector 表示二维数组比使用 vector vector 更有效。
  • 不必要的动态分配可能会代价高昂。鉴于 vector 元素本身已经在动态存储中,通常最好将对象直接存储为元素,而不是单独分配它们并存储智能指针。

关于c++ - 为什么 C++ 中 auto_ptr 的二维 vector 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65913577/

相关文章:

C++:数组索引没有增加

c++ - 如何确定树中元素的轮次(锦标赛括号)?

c++ - 面向对象的方程式 API

c# - 在 Windows 8 Metro-App 中打开 extern SQLite-Database?

c++ - 转换初始化器列表

c++ - boost::recursive_wrapper 和 std::unique_ptr

c++ - 为什么 C 数组比 std::array 快这么多?

c++ - 使用 -Wl,--as-needed 强制与共享库链接(仅提供模板时)

c++ - 将语法与匿名模板类型混淆?

c++ - 如果我在创建主窗口后使用 CreateEx( ... ),我将无法使用 FindWindow( ... )