今天,我没有多想,就根据给定枚举值的 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.
你可以成对编写这样的函数,比如
Xyz* CreateXyz();
void DestroyXyz(Xyz *xyz);
Abc* NewAbc();
void DeleteAbc(Abc *abc);
或者您只需将删除 Xyz/Abc 的责任转移给客户端,即调用该函数的人还必须在使用后对返回的对象执行
delete
。
无论您选择什么,请在文档中明确说明如何创建的对象应该被销毁。
我更喜欢配对功能,尤其是在删除之前需要考虑很多事情的情况下!
顺便说一句,您应该更喜欢使用
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
并完全忘记这种内存管理和指针所有权问题。
delete val;
val = NULL;