C++ 当混合使用默认构造函数和非默认构造函数时,RAII是如何工作的

C++ 当混合使用默认构造函数和非默认构造函数时,RAII是如何工作的,c++,C++,我想围绕使用malloc/free的C库编写一个库包装类(LibWrap)。为此,我想使用C++的RAII来分配和释放内存。我使用lib_地址作为我将从库中接收的随机示例地址。但是,在定义memeber变量时,以某种方式调用的析构函数有这个lib_地址 我希望由默认构造函数创建的成员变量的析构函数不知道我放入替换成员变量的构造函数中的新地址 #include <stdlib.h> #include <iostream> using namespace std; clas

我想围绕使用malloc/free的C库编写一个库包装类(LibWrap)。为此,我想使用C++的RAII来分配和释放内存。我使用lib_地址作为我将从库中接收的随机示例地址。但是,在定义memeber变量时,以某种方式调用的析构函数有这个lib_地址

我希望由默认构造函数创建的成员变量的析构函数不知道我放入替换成员变量的构造函数中的新地址

#include <stdlib.h>
#include <iostream>
using namespace std;

class LibWrap
{
    int j;
    int lib_address;
public:
    LibWrap(): //default LibWrap
    j(0),
    lib_address(0)
    {
        cout << "default LibWrap "<<j <<"\t\t"<<lib_address << "\t" << this<<endl;
    }

    LibWrap(int f_j): //special LibWrap
    j(0),
    lib_address(0)
    {
        j = f_j;
        lib_address = rand();
        cout << "special LibWrap " << j<<"\t"<< lib_address<< "\t" << this <<endl;
    }

    ~LibWrap()
    {
        cout << "killing LibWrap " << j<<"\t" <<lib_address <<"\t" << this<< endl;
    }

    int g()
    {
        return j;
    }
};

class A
{
    int i;
    LibWrap b;

public:
    A(): //default A
    i(0)
    {
        cout << "default A\t"<<i << endl;
    }

    A(int f_i)://special A
    i(0)
    {
        i = f_i;
        cout << "special A\t"<<i << endl;
        b = LibWrap(10);
    }
    ~A()
    {
        cout << "killing A\t"<<i << endl;
    }


    void p()
    {
        cout <<"Test values: "<< i<< "," << b.g() << endl;
    }
};

int f()
{
    //A a; a.p();
    cout << "variable\t\tlib_address\treal_address" << endl; 
    A a = A(1);
    cout << "End" << endl;
    //a.p();
}

int main()
{
    f();
}
这不会初始化
b
<代码>b已作为构建
A
的一部分进行初始化。您要做的是创建一个临时的
LibWrap
,并将该临时文件复制到
b
。然后,您正在销毁临时的
LibWrap
(这就是lib_地址的额外析构函数调用的来源)

临时
LibWrap
是“0xbfef2df8”地址的来源。
b
变量是“0xbfef2e28”地址。这就是为什么你要把它们按顺序排列

这不会初始化
b
<代码>b已作为构建
A
的一部分进行初始化。您要做的是创建一个临时的
LibWrap
,并将该临时文件复制到
b
。然后,您正在销毁临时的
LibWrap
(这就是lib_地址的额外析构函数调用的来源)


临时
LibWrap
是“0xbfef2df8”地址的来源。
b
变量是“0xbfef2e28”地址。这就是为什么你要把它们按顺序排列。

你能把它缩小一点,只显示你对pleaseOk有疑问的案例吗?我缩小了一点,希望它能帮助你缩小一点,只显示你对pleaseOk有疑问的案例吗?我缩小了一点,希望它能帮助你
variable        lib_address real_address
default LibWrap 0       0   0xbfef2e28
special A   1
special LibWrap 10  1804289383  0xbfef2df8 
killing LibWrap 10  1804289383  0xbfef2df8 --would expect kiling LibWrap 0  0 0xbfef2e28
End
killing A   1
killing LibWrap 10  1804289383  0xbfef2e28 --would expect killing LibWrap 10 1804289383 0xbfef2df8
b = LibWrap(10);