shared_ptr:没有实例化的分配

问题描述

我正在编写必须管理出色设计的代码

我现在遇到的问题是两个类之间的循环依赖关系:类A需要实例化B类,而类B需要实例化A类的shared_ptr。并且A是由继承B的类C构建的。因此C将*this传递给A的构造函数以进行构造。是的,我知道,这太可怕了。但我无法更改(类比A,B和C多得多)。

尽管如此,我还是尝试将所有这些类分开以进行测试(今天,所有这些都在一个测试类中以一个模块进行了测试)。

对于测试,我尝试仅考虑A和B类,而不考虑C。

我试图使用operator new为A分配内存而不建立任何对象(因为我需要B ...)。然后,我从分配的内存中为A建立一个shared_ptr,并通过传递此shared_ptr来建立B。 现在我已经实例化了B,我可以使用shared_ptr::get()将它传递给A来实例化新的位置。

它确实可以编译。但是在A实例的某个地方,分配了指针但没有任何对象的shared_ptr被其父类之一复制,而我在shared_ptr(析构函数)中崩溃。

我想这是因为这次袭击,但我不明白为什么。在询问您可能导致此崩溃的原因之前,我想知道您是否认为使用operator new,然后在我的用例中有意义的是放置新闻。 谢谢。

以下是此内存管理的一些代码

#include <iostream>
#include <memory>
 
struct Class_A
{
    int a = 1;
    int b = 2;
};

int main()
{
    void *rawMemory = operator new(sizeof(Class_A));
 
    std::shared_ptr<Class_A> foo1 = std::make_shared<Class_A>();
    
    std::shared_ptr<Class_A> foo2(static_cast<Class_A*>(rawMemory));
 
    std::cout << foo2->a << std::endl;
    std::cout << foo2->b << std::endl;
 
    foo1 = foo2;
 
    new (foo2.get()) Class_A();
 
    std::cout << foo2->a << std::endl;
    std::cout << foo2->b << std::endl;
 
    return 0;
}

解决方法

我发现了问题。

在我的代码中,为了执行operator new,我将变量sizeof()传递给了decltype。但是,如果是decltype中的shared_ptr,而不是元素类型。所以我因错误而崩溃:
free(): invalid size

我现在使用decltype(myVariable)::element_type,它确实可以工作。

因此,如果您无法更改旧代码的错误概念,则示例代码最终将是“好”黑客。