Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保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 - Fatal编程技术网

确保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++;对象已正确取消分配 我开始教自己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中的内存被正确地取消分配?每

这一切都是我所期望的。我遇到的问题是,在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中的内存被正确地取消分配?

每当您面临动态内存分配和非平凡的所有权语义时,智能指针通常是确保正确性的好方法


例如,请参见。

在本例中,您可以使用
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,并且完全避免使用指针。考虑到我问的是关于交易的问题,答案很有见地@雅克,有什么错误?