具有返回char *函数的内存管理

时间:2010-12-26 17:12:29

标签: c++ windows linux compiler-construction memory-management

今天,在没有多想的情况下,我根据给定枚举值的switch语句写了一个简单的函数返回char *。然而,这让我想知道如何释放那段记忆。我做的是这样的:

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

我很抱歉这是一个天真的问题,但是什么是释放内存的最佳方式,因为我无法在返回后删除内存,显然,如果我之前删除它,我将没有返回值。我认为可行的解决方案是这样的

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;
}

是否有人对这个和/或使用哪种解释有更深入的了解?

的问候,
丹尼斯M。

4 个答案:

答案 0 :(得分:2)

您是否考虑过使用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;
}

答案 1 :(得分:2)

您可以在对中编写此类函数,例如

Xyz* CreateXyz();
void DestroyXyz(Xyz *xyz);


Abc* NewAbc();
void DeleteAbc(Abc *abc);

或者您只需将删除Xyz / Abc的责任转移给客户端,即调用该函数的人在使用后也必须对返回的对象执行delete

无论您选择什么,请在文档中明确 应该销毁创建的对象。

我更喜欢配对功能,尤其是在删除之前要考虑很多事情的时候!

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

答案 2 :(得分:2)

如果您打算从函数返回原始指针,您必须清楚地说明删除指针的文档,即拥有的人。在这种情况下,您应该明确声明指针所有权转移给调用者,调用者负责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并完全忘记这种内存管理和指针所有权问题。

答案 3 :(得分:0)

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

delete val;
val = NULL;