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

C++ C++;:循环中变量的分配,c++,memory,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

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

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);
}
vec;
int i=0;
while(条件)
{
我++
共享的ptr sps(新的someStruct());
WCHAR wchr[20];
memset(wchr,i,20);
sps->pwsz=wchr;
矢量推回(sps);
}

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

我认为这段代码并没有达到您所期望的效果。您可能希望在堆上创建
wchr
,或者作为
someStruct
的成员

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

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


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

我认为这段代码没有达到您所期望的效果。您可能希望在堆上创建
wchr
,或者作为
someStruct
的成员

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

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


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

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

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

为了解决这个问题

  WCHAR * wchr = new WCHAR [20];

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

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

为了解决这个问题

  WCHAR * wchr = new WCHAR [20];

+1但请注意:“堆栈位置在每次迭代中都是相同的。”可能是,也可能不是。更可能是调试版本。但这当然不重要。@John:是的,我不确定是否保证相同,但我想不是。我在上面加了一条注释。事实上,很有可能是这样。编译器通常在输入函数时为函数中使用的每个变量保留内存(这意味着它们在输入时保留一次,并且堆栈指针在函数执行期间不会移动,除非它调用另一个函数)。+1但请注意:“堆栈位置在每次迭代时都是相同的。”也许,也许不是。更可能是调试版本。但这当然不重要。@John:是的,我不确定是否保证相同,但我想不是。我在上面加了一条注释。事实上,很有可能是这样。编译器通常在输入函数时为函数中使用的每个变量保留内存(这意味着它们在输入时保留一次,并且堆栈指针在函数执行期间不会移动,除非它调用另一个函数)。