C ++:为什么这个智能动态指针不可用?

时间:2017-05-03 07:48:47

标签: c++ smart-pointers

当我运行B行时,一切似乎都没问题,但当我将它换成A行时,它崩溃了,我不知道为什么。

 #include <iostream>
 #include <vector>
 #include <memory>

using namespace std;

int main() {
  vector<int> vi(10,5);
  auto ptr = make_shared<vector<int>>(vi); //A
  // auto ptr = &vi; //B
  auto beg = ptr->begin();
  while (beg != vi.end())
    cout << *beg++ << " ";
  return 0;
}

1 个答案:

答案 0 :(得分:1)

您正在使用ptr->begin()vi.end()。当* ptr是vi时,那很好,但是你的make_shared<vector<int>>(vi)行实际上调用了复制构造函数并创建了一个新的vi副本。

如果你真的需要在堆栈中创建一个shared_ptr,你需要像这样创建它:

auto ptr = shared_ptr<vector<int>>(&vi, [](vector<int>*){}); //A

这为shared_ptr提供了一个空删除器,因此它不会尝试删除堆栈中的任何内容(这会导致崩溃)。

注意:这几乎总是一个坏主意,因为它违反了shared_ptr的整个目的;它不再拥有任何东西。这使得调试困惑。你需要确保堆栈向量肯定比使用shared_ptr或你的应用程序崩溃的时间更长。