假设我有一个这样的循环:
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
是相同的。这是因为我传递了一个指向循环中分配的内存的指针,这在每次迭代后被破坏,然后在下一次迭代时重新填充相同的内存吗?
答案 0 :(得分:5)
我认为这段代码不符合您的预期。您可能希望在堆上创建wchr
或作为someStruct
的成员。
wchr
在堆栈上分配,并在每次迭代时释放。堆栈位置在每次迭代时都是相同的(可能是相同的)。
每个智能指针都包含指向该无效内存地址的指针。
在while循环之后,所有智能指针都指向同一个已释放的无效地址。地址在每次迭代时重复使用并释放。
答案 1 :(得分:3)
sps->pwsz
是char缓冲区的指针。您为每个新的sps实例指定一个指向同一内存位置的指针。
更糟糕的是,在循环结束后,内存位置被解除分配,很可能会被其他代码快速重用。它在while循环之外是无效的。
要解决此问题,
WCHAR * wchr = new WCHAR [20];