2016-10-07 27 views
1

我声明了矢量:可用内存

vector<Object> my_vect; 

,我推一些对象到它像

my_vect.push_back(*(new Object())); 

我知道这将是简单如果我要声明一个指针向量,但这对我的代码至关重要。

我尝试使用

my_vect.clear() 

,但无济于事。

此外,我也尝试过让指针的对象,如:

vector<*Object> new_my_vect; 

for(int i = 0; i < my_vect.size(); i++) 
{ 
    new_my_vect.push_back(&my_vect[i]); 
} 

for(int i = 0; i < new_my_vect.size(); i++) 
{ 
    delete new_my_vect[i]; 
} 

但我得到一个“free(): invalid pointer:”的错误。

感谢信,

+2

为什么你认为你需要'new'在这里创建的对象:'my_vect。 push_back(*(new Object()));'实际上? –

+0

我刚刚使用my_vect.push_back(Object())。我是C++新手,所以我不太确定对象是否需要存储在堆中。所以只是一个后续问题:即使我使用超出范围的对象(通过将其存储在向量中),为什么它工作正常?它不会被其他东西覆盖在堆栈上吗? –

回答

1

你应该对象添加如下

vector<Object> my_vect; 

my_vect.emplace_back(); 

my_vect.push_back(Object()); 

我不会建议让指针与载体内的对象,如果有的话导致向量重新分配这些指针将被无效,因为底层数组将被复制到别处。

+0

或'vector my_vect(n);'。 –

+0

非常感谢您的回答。我结束了使用my_vect.push_back(Object())。我是C++新手,所以我不太确定对象是否需要存储在堆中。所以只是一个后续问题:即使我使用超出范围的对象(通过将其存储在向量中),为什么它工作正常?它不会被其他东西覆盖在堆栈上吗? –

1

*(新对象())

这是内存泄漏。它在堆上创建一个新对象,取消引用它,创建一个副本(除非vector :: push_back使用移动语义),然后泄漏由堆分配保留的内存。

vector < * Object> new_my_vect;

对(INT I = 0;我< my_vect.size();我++){ new_my_vect.push_back(& my_vect [I]); }

对(INT I = 0;我< new_my_vect.size();我++){ 删除 new_my_vect [I]; }

这是取对象存储在向量本身的地址。这绝对保证不会与您传入向量中的对象的地址相同。矢量可以随意重新分配和重新排列它的内部记忆。只要您不修改矢量,只需要向量中的某个对象的地址即可。使用删除释放此内存是无效的。

这里的全部问题是,您正在向量中存储对象的值,而不是地址。改为存储指针。这样你可以添加堆分配的对象,然后循环遍历矢量并在完成时释放它们。这样它只会复制指针,而不是对象。

vector<Object*> objs; 
for (int i = 0 ; i < 10 ; ++i) { 
    objs.push_back(new Object()); 
} 
for (unsigned int i = 0 ; i < vec.size() ; ++i) { 
    delete objs[i]; 
} 
+0

感谢您的回答。现在非常清楚。对不起,不能upvote(我没有足够的代表哈哈)。 –

1

这样做

my_vect.push_back(*(new Object())); 

导致这些:在堆上创建

  1. 物体的物体。

  2. 对象的指针被取消引用*(..)并作为push_back中的参数传递。

  3. 此对象的副本在存储在向量中时创建。

  4. 只要push_back返回,最初创建的对象仍然被分配,没有人能够释放它,因为它的指针保持不了任何状态。所以产生了内存泄漏。

如前所述,如果你需要“对象”对象的载体,你可以通过堆栈

my_vect.push_back(Object()); 
+0

感谢您的回答。现在非常清楚。对不起,不能upvote(我没有足够的代表哈哈)。 –