C++按值传递struct或object

Ger*_*mán 3 c++ memory-management

我有这个:

enum Units { Pounds, Kilos };

struct Configuration
{
    const Units units;
    const char *name;

    inline Configuration(Units pUnits, char *pName) : units(pUnits)
    {
        name = strdup(pName);
    }

    inline ~Configuration() { free((void *)name); }
};
Run Code Online (Sandbox Code Playgroud)

我正在将其中一个传递给这样的方法:

Configuration cc(Kilos, "abc");
cdao->write(cc);
Run Code Online (Sandbox Code Playgroud)

我从这里得到了令人讨厌的崩溃,直到我尝试重新定义方法来引用:

Configuration cc(Kilos, "abc");
cdao->write(&cc);
Run Code Online (Sandbox Code Playgroud)

现在一切正常.

但是,价值结构怎么可能与内存紧密相连?

小智 6

您使用strdup的事实表明您的代码有问题,而错误的是您没有复制构造函数.每当你有一个析构函数时,你几乎肯定还需要一个复制构造函数,它会在你按值调用时正确复制对象.

要改进您的代码:

  • 创建一个复制构造函数,可能是一个赋值操作符,它正确地分配和复制字符串

  • 更好的是,摆脱strdup - 使用std:;字符串,在这种情况下你不需要析构函数,复制ctor或赋值操作.

  • 摆脱"内联"关键字 - 他们什么都不做.