确保C++;对象已正确取消分配 我开始教自己C++,如何处理没有垃圾回收器的对象,这给我带来了一些困惑。下面是一个简单的例子,说明我正在尝试做什么: A* a; B b = new B(a); // Note that B is a derived class of A a = &b; while (a != NULL) { (*a).run(); }
这一切都是我所期望的。我遇到的问题是,在B的run()方法中,我想做如下操作:确保C++;对象已正确取消分配 我开始教自己C++,如何处理没有垃圾回收器的对象,这给我带来了一些困惑。下面是一个简单的例子,说明我正在尝试做什么: A* a; B b = new B(a); // Note that B is a derived class of A a = &b; while (a != NULL) { (*a).run(); },c++,oop,C++,Oop,这一切都是我所期望的。我遇到的问题是,在B的run()方法中,我想做如下操作: C c = new C(a); // a is the same pointer as above, that has been stored // and C another derived class from A a = &c; 然后让run()退出。然后,第一个块中的while循环将调用新对象上的run()。我的问题是,如何确保原始b中的内存被正确地取消分配?每
C c = new C(a); // a is the same pointer as above, that has been stored
// and C another derived class from A
a = &c;
然后让run()退出。然后,第一个块中的while循环将调用新对象上的run()。我的问题是,如何确保原始b中的内存被正确地取消分配?每当您面临动态内存分配和非平凡的所有权语义时,智能指针通常是确保正确性的好方法
例如,请参见。在本例中,您可以使用
std::shared\u ptr
。如果两个类的成员需要指向同一个对象,则可以使它们都共享\u ptr
。你通常会这样做,但是,如果在这样做的时候,如果你要创建循环依赖,然后要打破这个循环依赖,你需要std::weak_ptr
下面是std::shared_ptr
和std::weak_ptr
的示例
错误代码(循环依赖):
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::shared_ptr<A> ba; //this creates a cyclic dependency.
}
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::weak_ptr<A> ba; //break cyclic dependency with std::weak_ptr
}
structb;
结构A
{
std::共享的ptr bp;
}
结构B
{
std::shared_ptr ba;//这将创建一个循环依赖项。
}
正确的代码(非循环):
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::shared_ptr<A> ba; //this creates a cyclic dependency.
}
struct B;
struct A
{
std::shared_ptr<B> bp;
}
struct B
{
std::weak_ptr<A> ba; //break cyclic dependency with std::weak_ptr
}
structb;
结构A
{
std::共享的ptr bp;
}
结构B
{
std::weak_ptr ba;//使用std::weak_ptr中断循环依赖关系
}
您不需要通过new
分配所有内容。这样声明变量是非常好的(实际上更可取):B代码>或C代码>。如果对象需要存在于其当前作用域之外,请使用。上述大多数代码都无法编译。在C++对象中,指向对象的指针不一样。我发现我的操作过于复杂。我只是简单地将run()返回类型设为A,并且完全避免使用指针。考虑到我问的是关于交易的问题,答案很有见地@雅克,有什么错误?