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

问题描述 投票:0回答:4

今天,我没有多想,就根据给定枚举值的 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.

c++ linux windows memory-management
4个回答
2
投票

你可以成对编写这样的函数,比如

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


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

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

delete

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

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

顺便说一句,您应该更喜欢使用

std::string
,而不是
char*
。尽可能多地利用STL。他们可以解决你的大部分问题!以上建议是针对STL不适合的情况!总的来说,更喜欢STL!


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

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

并完全忘记这种内存管理和指针所有权问题。

    


0
投票

delete val; val = NULL;

	
© www.soinside.com 2019 - 2024. All rights reserved.