内存pipe理与返回字符*function

今天,没有太多的想法,我写了一个简单的函数返回一个char *基于给定枚举值的switch语句。 不过,这让我想知道我该如何释放这些记忆。 我所做的是这样的:

char* func() { char* retval = new char[20]; // Switch blah blah - will always return some value other than NULL since default: return retval; } 

我很抱歉,如果这是一个天真的问题,但是什么是最好的方式来释放内存看到我不能删除内存后返回,显然,如果我删除它之前,我不会有一个返回值。 我想作为一个可行的解决scheme是这样的

 void func(char*& in) { // blah blah switch make it do something } int main() { char* val = new char[20]; func(val); // Do whatever with func (normally func within a data structure with specific enum set so could run multiple times to change output) delete [] val; val = NULL; return 0; } 

任何人都可以有更多的了解这个和/或解释使用?

问候,
丹尼斯

Solutions Collecting From Web of "内存pipe理与返回字符*function"

你可以写成这样的功能,像

 Xyz* CreateXyz(); void DestroyXyz(Xyz *xyz); Abc* NewAbc(); void DeleteAbc(Abc *abc); 

或者您只是将删除Xyz / Abc的责任转移给客户端,即调用该函数的用户在使用后还必须对返回的对象进行delete操作。

无论你选择什么,在你的文档中清楚地说明创建的对象应该如何销毁。

我更喜欢pair函数,尤其是在删除之前有很多事情要考虑的话。

顺便说一句,你应该更喜欢使用std::string ,而不是char* 。 尽可能多地使用STL。 他们可以解决你的大部分问题! 以上建议适用于STL不适合的情况! 一般来说,更喜欢STL!

你有没有考虑使用STL类型或其他类而不是返回一个原始指针? 例如,如果你的char *是一个字符串,而是使用std::string来避免任何泄漏的风险:

 std::string func() { std::string retval(""); // Switch blah blah - will always return some value other than NULL since default: return retval; } 

如果你打算从一个函数中返回原始指针,那么你必须在删除指针的文档上明确指出,比如谁拥有它。 在这种情况下,你应该明确指出指针的所有权被转移给了负责delete它的调用者。

虽然很多人只需在文档中指定所有权即可,但通常最好在代码中执行此策略。 特别的, 智能指针通常用于这个目前的C ++标准提供了std::auto_ptr ,一个智能的指针,在拷贝上转移所有权,也就是当你把它返回给调用者时,你将所有权转移到目标std::auto_ptr 。 请注意, std::auto_ptr自动delete被销毁的内存,如果它仍然拥有它的话。 即将到来的C ++标准提供了std::unique_ptr ,它以类似的方式工作,但使用移动语义。

不幸的是, std::auto_ptr不是数组(它需要delete []而不是delete ),所以你不能使用你的目的。 我认为没有包含数组auto_ptr的决定是故意的,因为STL已经提供了你可能需要的所有容器,如果你需要返回一个由它们自己的内存管理和复制处理的项目集合的话。

特别是,对于字符串,你应该简单地使用std::string并完全忘记这种内存管理和指针所有权问题。

在这种情况下,调用func()的人应该在不需要的时候释放内存。 但正确的删除是这样的:

 delete val; val = NULL;