当我运行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;
}
答案 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或你的应用程序崩溃的时间更长。