2014-04-05 176 views
0

假设我需要从另一个容器创建一个堆分配容器。初始容器是否需要堆分配,或者它的值是否隐式复制到堆中,因此原始容器可以只是一个局部变量?例如:堆分配对象构造函数

list<int> my_function() 
{ 
    set<int> my_set; 
    my_set.insert(1); 
    my_set.insert(2); 

    list<int> *my_list = new list<int>(my_set.begin(), my_set.end()); 

    return *my_list; 
} 

list<int> my_function() 
{ 
    set<int> *my_set = new set<int>; 
    my_set->insert(1); 
    my_set->insert(2); 

    list<int> *my_list = new list<int>(my_set->begin(), my_set->end()); 

    return *my_list; 
} 

哪以上是正确的?当然,我想避免在不知道的情况下复制堆内存。

回答

2

这将是正确的:

list<int> my_function() 
{ 
    set<int> my_set; 
    my_set.insert(1); 
    my_set.insert(2); 
    return list<int>(my_set.begin(), my_set.end()); 
} 

我不知道你的意思是用“堆分配”是什么,但请记住,这listset数据已经存储在堆上。

+0

感谢您的快速响应。我对C++相当陌生 - 对象构造函数是否隐式使用new?我很困惑,因为它看起来好像会返回一个局部变量,除非使用return关键字调用的构造函数增加了对象的范围。 –

+0

STL容器需要分配数据来存储您添加的元素。内存分配在堆上。因此,如果你写'set my_set;'大部分数据已经存储在堆中。 – Danvil

+0

如果你写'A foo(){A a;返回一个; }'那么它会返回一个副本。对于STL容器,这可以进行优化。如果你想确保没有不必要的复制,你可以使用指针。但是,你必须注意调用delete或使用'shared_ptr'。 – Danvil

相关问题