2017-05-03 124 views
-4

當我運行B行時,一切看起來都不錯,但是當我將它換成A行時,它崩潰了,我不知道爲什麼。C++:爲什麼這個智能動態指針不可用?

#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

請用代碼和解釋什麼是問題來創建你的問題。不與任何鏈接。 – granmirupa

+0

請在說明中加入程序清單,沒有人想看代碼圖片。 – Gnqz

+0

除了不想看圖片;當別人來搜索同樣的問題時,他們將無法找到它;或者如果他們設法從你的問題中找到這個頁面,你的代碼將不再可用。 – UKMonkey

回答

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或應用程序崩潰的時間要長。

+0

明白了,謝謝哥們 – Murphy