我有以下代码示例..
std::vector<char*> vNameList;//it will be defined globally..
int main(int argc, char* argv[])
{
CollectName();
for(int i = 0; i<(int)vNameList.size(); i++)
{
printf("\n %s" , vNameList[i]);//Here gabage values are getting printed on console
}
return 0;
}
void CollectName()
{
char *Name = new char[sizeof(NAME)+1];//NAME datatype is defined having size of 32 char
//processing for Name is performed , which includes assigning Name variable with value..
//now insert it into vector
vNameList.push_back(Name);
delete[] Name; //at this Name value inserted into vector become garbage
}
我相信如果我们用new初始化char *,必须删除它以避免内存泄漏。但这导致修改矢量值。
请引导我,以便我可以更正我的代码,这将给我正确的价值。
我有一些限制只使用Char *,因此建议使用char *来实现此目的。
答案 0 :(得分:1)
您可以通过在完成之后删除指针来更正代码(假设您实际上有使用指针的代码。您的示例代码根本不打印任何内容,垃圾或者其他)。
但通常更好的设计是在std::string
中存储字符串,当您将std::string
存储在std::vector
中时,您不再需要手动管理内存。
答案 1 :(得分:1)
这是因为数组的名称在c ++中被视为指针(或c,它是无意义的)。
因此当你这样做时
vNameList.push_back(Name);
它将char *
插入到向量中,即指向第一个字符(因此是字符串)到向量的指针,但是之后删除指针,因此得到垃圾值。但是,如果你不删除指针,它就可以正常工作,因为指针仍然存在,但这样你就不会释放内存。因此:不要使用
这里是:LIVE EXAMPLE
为避免这种麻烦:您应该使用
std::vector<std::string> vNameList;
代替。