考虑以下代码片段(模仿我的大项目中正在进行的事情,使用C ++代码中的一些C例程)
#include <string>
#include <iostream>
#include "stdafx.h"
struct lName
{
std::string name;
};
void lalloc( int *nloc, lName **tst)
{
lName *tst1;
int bn = 2;
tst1 = (lName*)malloc(bn * sizeof(*tst1));
memset((void*)tst1, 0, bn * sizeof(*tst1));
*nloc = bn;
*tst = tst1;
}
void ltest()
{
std::string fid = "tst";
lName *tst, *tst1;
int lsz;
lalloc(&lsz, &tst);
for (int j = 0; j < lsz; ++j)
{
tst1 = &tst[j];
tst1->name = fid;
std::cout << "fid : " << fid << " Name: " << tst1->name << "\n";
}
}
在Visual Studio 2017中,tst1->name
的内容在赋值后是垃圾(在分配之前为空字符串)。但是,如果我使用tst1->name = std::string(fid);
,它似乎按预期工作(我的理解是这一行将创建一个临时的)。似乎在VS2012中也能正常工作。代码中有什么东西不符合要求吗? (真正的代码涉及适当释放内存等)