2015-10-23 64 views
2

我有一個函數返回一個對象的向量,我想創建一個從這些對象中獲取成員的向量。我正在使用std :: transform來做到這一點。但是,代碼segfualts。 GDB不是很有幫助。任何人都可以解釋發生了什麼?std ::轉換臨時對象

#include <algorithm> 
#include <iostream> 
using namespace std; 

class Container 
{ 
    private: 
    string _id; 

    public: 
    Container(const string &str): _id(str) {} 

    const decltype(_id) &id() const { 
     return this->_id; 
    } 

}; 

Container a{"hello"}, b{"world"}; 

vector<Container *> fn() 
{ 
    return {&a,&b}; 
} 

int main() { 
    vector<string> ids; 
    const auto &elements = fn(); 
    std::transform(elements.begin(), elements.end(), ids.begin(), [](const Container *container){ return container->id();}); 

} 
+0

'elements'指向已過期的臨時文件 – Dani

+1

這實際上沒問題。臨時參考的生命延長了。我應該使用後面的插件來標識。 – SPMP

回答

2

ids.begin()不是一個迭代器長度elements.size()的有效範圍,因爲ids是空的,elements有大小2

你可能想std::back_inserter(ids)代替:

std::vector<std::string> ids; 

std::transform(elements.begin(), elements.end(), 
       std::back_inserter(ids), 
       [](const Container *container){ return container->id();}); 

assert(ids.size() == elements.size()); 
2

vector<string> ids;是空向量,並且您正嘗試使用正常的迭代器向其添加元素。這將導致段錯誤,因爲您將訪問您不擁有的內存。你需要的是一個back_inserterpush_back元素到矢量中。

std::transform(elements.begin(), elements.end(), std::back_inserter(ids), 
       [](const Container *container){ return container->id();});