gpt4 book ai didi

c++ - 在删除结构之前是否必须删除结构中的指针变量?

转载 作者:行者123 更新时间:2023-11-30 00:43:52 25 4
gpt4 key购买 nike

我已经开始使用 C++,需要一些关于 C++ 内存管理的说明。我遇到过智能指针,但我想了解一些基本概念。

这是一个示例结构

struct A
{
private:
int a;
void* b;
public:
A(int i, void* m) { a=i; b=m; }
};

main()
{
A * a1 = new A(10, 0);
//
//Some Code
if(on some condition) {
delete a1;
a1=nullptr;
}
}

当我删除 a1 时,m 也会自动删除,还是我应该在删除 a1 之前明确删除 m,如下所示?

delete a1->b;
a1->b = nullptr;
delete a1;
a1=nullptr;

最佳答案

When I delete a1, will m also be deleted automatically

不,它不会(您的代码可能有内存泄漏)。你需要一个明确的 destructor删除它。

顺便说一句,使用 void*b;指针字段味道很差。如果你知道,你应该更喜欢一些更明确的类型(例如 double*b;SomeClass* b; )。这使您的代码更具可读性,并提供更多机会在编译时进行有用的类型检查。

// inside struct A
~A() { delete b; };

了解 rule of five .

注意 struct -s 是 very similarclass -C++ 中的 es。

避免 memory leaks . valgrind 等工具可能会有帮助。并系统地使用smart pointers标准容器应该有助于避免它们。如果你的领域b was声明std::shared_ptr<std::string> b;默认析构函数会适本地释放它。也许你希望它是一些 std::vector<std::string> (同样,默认析构函数正在适本地释放内存)。

一个好的编码提示是尽可能避免声明 raw pointers (更喜欢智能指针和容器)。当你必须声明一个时,你需要编码它的 delete适本地。

关于c++ - 在删除结构之前是否必须删除结构中的指针变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52032987/

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