C ++:循环中变量的分配

时间:2010-06-08 19:51:56

标签: c++ memory

假设我有一个这样的循环:

vector<shared_ptr<someStruct>> vec;
int i = 0;
while (condition)
{
     i++
     shared_ptr<someStruct> sps(new someStruct());
     WCHAR wchr[20];
     memset(wchr, i, 20); 
     sps->pwsz = wchr;
     vec.push_back(sps);
}

在这个循环结束时,我看到对于向量的每个sps元素,sps->pwsz是相同的。这是因为我传递了一个指向循环中分配的内存的指针,这在每次迭代后被破坏,然后在下一次迭代时重新填充相同的内存吗?

2 个答案:

答案 0 :(得分:5)

我认为这段代码不符合您的预期。您可能希望在堆上创建wchr或作为someStruct的成员。

wchr在堆栈上分配,并在每次迭代时释放。堆栈位置在每次迭代时都是相同的(可能是相同的)。

每个智能指针都包含指向该无效内存地址的指针。

在while循环之后,所有智能指针都指向同一个已释放的无效地址。地址在每次迭代时重复使用并释放。

答案 1 :(得分:3)

sps->pwsz是char缓冲区的指针。您为每个新的sps实例指定一个指向同一内存位置的指针。

更糟糕的是,在循环结束后,内存位置被解除分配,很可能会被其他代码快速重用。它在while循环之外是无效的。

要解决此问题,

  WCHAR * wchr = new WCHAR [20];