Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将带有new的char*插入向量C++;_C++_C Strings - Fatal编程技术网

C++ 将带有new的char*插入向量C++;

C++ 将带有new的char*插入向量C++;,c++,c-strings,C++,C Strings,我有如下代码示例 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

我有如下代码示例

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
}
std::vector vname列表//它将在全球范围内定义。。
int main(int argc,char*argv[])
{
CollectName();

对于(int i=0;i,只有在使用完指针之后,才可以通过删除指针来更正代码(假设您确实有使用指针的代码。您的示例代码根本不打印任何内容,垃圾或其他内容)


但是通常更好的设计是将字符串存储在
std::string
中,并且当您将
std::string
s存储在
std::vector
中时,您不再需要手动管理内存。

这是因为数组的名称在c++中被视为指针(或c,它是内置的)

所以当你这样做的时候

vNameList.push_back(Name);

它将
char*
插入向量,即指向第一个char的指针(即字符串)指向向量,但随后删除指针,因此会得到垃圾值。但是,如果不删除指针,它会正常工作,因为指针仍然存在,但这种方式不会释放内存。因此:不要使用此

这是:

要避免这种麻烦:您应该使用

std::vector<std::string> vNameList;
std::vector vname列表;

相反。

你的向量是空的。循环不应该运行。为什么要麻烦首先解决这个问题呢?
std::vector
就可以了。在你的例子中,你在哪里调用
CollectName
?伙计,你想在vector中保留指针,但之后你想删除它们的值。为什么?实际上,如果你正确删除了向量,你可以避免内存泄漏。“如果不删除指针,它工作正常”-只要找到另一个(可靠的)修复泄漏的方法。@AbhishekGupta-我已经检查过它,删除调用是命令,但这不会导致任何内存泄漏吗?我已经读到,每当使用新的时,它都应该被删除。@user987316您真的需要使用
std::vector
?有什么好的理由不使用
std::vector
?其他方面,您最好的选择是复制each逐个字符,然后使用
delete