【问题标题】:C++ Bi-directional class association (Using forward declaration)C++ 双向类关联(使用前向声明)
【发布时间】:2019-10-15 23:57:05
【问题描述】:

这里对 C++ 很陌生,我正在尝试在两个类之间创建双向的一对多关联。

这是我目前取得的成就:

class_a.h

#ifndef CLASS_A_H
#define CLASS_A_H

class ClassB;
class ClassA {
public:
   std::vector<ClassB *> Bs;
};

#endif

class_b.h

#ifndef CLASS_B_H
#define CLASS_B_H

class ClassA;
class ClassB {
public:
   ClassA *classA;
   std::string name;
};

#endif

但是,在测试以下代码时,输​​出显示test

b 是否被正确删除?这段代码不应该返回 139 错误吗?

ma​​in.cpp

auto *a = new ClassA();
auto *b = new ClassB();

b->classA = a;
b->name = "test";

delete b;

std::cout << b->name << std::endl;

谢谢!

【问题讨论】:

    标签: c++ forward-declaration


    【解决方案1】:
    delete b;
    

    一旦你删除了b,它(以及任何其他指向同一个对象的引用/指针/迭代器)就会失效。

    通过无效指针间接访问成员的行为未定义。

    std::cout << b->name << std::endl;
    

    在这里,你通过一个无效的指针间接访问一个成员。程序的行为未定义。

    b 被正确删除了吗?

    我没有看到相反的证据。

    这段代码不应该返回 139 错误吗?

    我不知道 139 错误是什么,但不知道,C++ 不保证会返回此类错误。当行为未定义时,没有任何保证。

    【讨论】:

    • 139 可能是 shell 中的退出代码,对应于 SIGSEGV aka 分段错误。
    • 是的,根据 C++ 标准,它是undefined behavior。但只是为了解释可能发生的情况:在调用delete 之后,堆管理器将认为内存是空闲的,这意味着可以将内存重新分配给其他一些内存分配。因此,它很可能在将来的某个时间被覆盖。但是,这还没有发生,所以取消引用内存仍然会给你旧值。然而,这都是猜测,无法回答,因此术语未定义的行为。
    • 知道了。感谢您的回复!事实上,由于运行这个 sn-p 后 shell 没有返回任何错误,我担心可能存在内存泄漏。
    • @Manu 好吧,您确实有泄漏,因为您从未删除 a。您可以使用诸如 valgrind 之类的工具来检测内存泄漏,或者使用编译器中内置的泄漏清理器。
    • 哦,完全没看到!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2023-03-16
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多