Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/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++ C++;将分配的字符*释放为字符串_C++_String_Memory Management_Char_Strdup - Fatal编程技术网

C++ C++;将分配的字符*释放为字符串

C++ C++;将分配的字符*释放为字符串,c++,string,memory-management,char,strdup,C++,String,Memory Management,Char,Strdup,我试图找到答案,但看不到任何直接的答案 如何在下一个代码段中释放分配的内存: const char*attStr=strdup(OtherCharStr); 字符串str(attStr,strlen(attStr)); 删除str;/??? < />代码> 您需要释放AtSTR而不是单独释放其资源的C++字符串。 void func() { const char* attStr = strdup(OtherCharStr); string str(attStr, strlen(

我试图找到答案,但看不到任何直接的答案

如何在下一个代码段中释放分配的内存:

const char*attStr=strdup(OtherCharStr);
字符串str(attStr,strlen(attStr));
删除str;/???

< />代码>

您需要释放AtSTR而不是单独释放其资源的C++字符串。
void func()
{
    const char* attStr = strdup(OtherCharStr);
    string str(attStr, strlen(attStr));
    free(attStr);
}//here str will release its own resources
你也能做到 字符串str=OtherCharStr; A就是这样。只检查OtherCharStr发生了什么,C++使用了一个名为的习惯用法。这意味着对象生命周期是由可变范围驱动的

{
    std::string s("foo"); // variable s declaration and string initialization
    do_some_stuff(s);
    // end of scope of variable s - it is destroyed here
    // no need to free(s) or whatever
}
// variable s and the string doesn't exist here, no memory for it is allocated
<>这只适用于C++对象,这些对象可以正确地维护资源(在析构函数中释放它们)。简单的指针不行-你必须自己释放它们:

const char *attStr = strdup(...);
// do something with attStr
free(attStr); // because strdup() documentation says you should free it with free()

还注意到C++使用了<代码>新< /COD>和 >删除< /代码>而不是<代码> MalCube()/<代码>和<代码> For():< /P>


我建议阅读一些关于自动删除指向的对象的内容。我已经远离了原来的问题,但是这个主题对于理解C++是如何工作的很重要。

使用<代码>免费(AtSTR);<在这种情况下,请不要使用
strdup
。只需执行std::string str(OtherCharStr)
std::string
已经复制了它。@CaptainObvlious,但是由于某种原因,当我打印输出时,我得到了垃圾,我认为这是因为
str::string str(OtherCharStr)
分配的内存在我离开函数后被释放。“离开函数后被释放”-您的问题不包括有关其使用的任何信息或从函数返回值的示例。总的来说,这是一个很糟糕的问题。按值返回
std::string
,让编译器处理优化(RVO/NRVO)。@CaptainObvlious,我的问题很好,你的答案是垃圾!“不要使用strdup。只需执行std::string str(OtherCharStr);”我没有要求您提供复制字符串的替代方法,我专门询问了如何释放分配的内存!如果你没有好的或相关的答案,那就走开吧。非常感谢,我很喜欢阅读你的答案,我真的觉得我现在更明白了。
std::string *strPointer = new std::string(...);
// RIAA doesn't work here, because strPointer is just plain pointer,
// so this is the case when you need to use free() or delete
delete strPointer;