gpt4 book ai didi

c++ - 谁负责释放分配的内存?

转载 作者:行者123 更新时间:2023-11-28 08:08:29 25 4
gpt4 key购买 nike

考虑以下代码片段

void xyz(CString **mapping)
{
*mappings = new CString[10];
(*mappings)[0] = "hello";
//...
}

void main(int argc, char **argv)
{
CString *tmp;
xyz(&tmp);
// now we have the CString array defined in xyz
}

我想做的是用另一个函数生成的一些值填充 main 中的 var。我读到它的最佳实践是在分配的同一函数中删除/释放。在这种情况下这是不可能的,因为 xyz 存在的唯一原因是生成数据(这只是一个例子,在实际情况下 xyz ;)).我还考虑在 main 中的堆栈上创建一个数组并将其传递给函数,但在我的情况下,数组的大小当时不是固定的(它在 xyz 中确定)。清理分配的内存最干净、最常用的方法是什么?如果我们有一个方法为 xyz 的对象,那么最佳实践是什么?要创建另一个方法(例如 freeMapping()),调用者在处理数据后必须调用该方法?

最佳答案

多年来,人们使用了许多不同的方案,有好有坏。好的策略定义了一种严格且一致的模式,该模式为资源的“所有权”建立规则,即清理和确保没有人非法访问资源的责任。成功策略的规则也是这样,只有资源的本地 View 及其使用方式对于安全访问资源是必要的。

您应该在现代 C++ 中使用的策略称为 RAII 或“资源获取即初始化”。这个名字的意思是任何获得的资源都应该是一个初始化。例如:

std::string s = "Hello, World";

此代码获取一些内存作为存储字符串数据的资源,但您看到的只是字符串已初始化。初始化的对象拥有内存。这意味着它负责管理内存的生命周期并限制对其的访问。使用对象的代码根本不需要考虑资源。它只需要确保正确使用对象本身,然后隐藏资源的生命周期就会得到正确管理。

使用 RAII 不仅便于保持资源的正常管理本地化,还大大简化了在出现异常时正确清理资源的过程。当一个范围由于异常而退出时,C++ 保证销毁该范围内所有完全构造的对象。如果清理资源的必要任务由对象析构函数完成,那么资源就不会泄漏,也不需要为使用资源的每个范围添加显式异常处理。

C++ 已经包含许多类型资源的资源拥有类。对于动态大小的数组,使用 std::vector:

std::vector<CString> xyz()
{
// C++11
return {"hello",...};

// or C++03
std::vector<CString> mappings;
mappings.push_back("hello");
...
return mappings
}

void main(int argc, char **argv)
{
std::vector<CString> tmp = xyz();
// now we have the CString array defined in xyz
// the array gets automatically cleaned up by std::vector's destructor
}

关于c++ - 谁负责释放分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com