【问题标题】:C++ pointer member initializationC++ 指针成员初始化
【发布时间】:2021-12-28 11:56:19
【问题描述】:

我知道这是非常基本的,但鉴于我的 C++ 使用非常有限,我不知道答案。

有人告诉我,每当一个类包含一个指针作为成员时,我应该为它分配内存。 (然后在析构函数中使用'delete'来释放空间)

class Person{
    public:
    string* ptr_name;
    Person(string& name){
        ptr_name = new string(name);
    }
...
}

我在想我是否可以这样做

class Person{
    public:
    string* ptr_name;
    Person(string name){
        ptr_name = &name;
    }
...
}

由于我没有在构造函数参数中使用“&”,因此“名称”在构造函数中按值复制。所以已经为它分配了内存。显式析构函数将是不必要的,因为指针将在堆栈上自动销毁。

这行得通吗?

【问题讨论】:

    标签: c++ object pointers scope new-operator


    【解决方案1】:

    调用此构造函数后

    Person(string name){
        ptr_name = &name;
    }
    

    指针ptr_name 将无效,因为局部变量name 将被销毁。

    因此,取消引用此类指针将导致未定义的行为。

    【讨论】:

    • 我也在考虑这个问题。但我无法得到一个错误案例来证明这一点。你有什么建议吗?
    • @yuhao 未定义的行为意味着任何事情都可能发生,即使您可以获得预期的结果。试试这个代码 class Person { public: std::string *ptr_name;人(std::string name){ ptr_name = &name; } };人人(“你好”); std::cout
    • 我同意你的观点,并尝试在字符串上使用包装类来显示“name”在构造函数完成时确实被破坏,所以我认为不应使用 &name。奇怪的是,测试用例 10 次中只有 10 次为我返回“Hello”,这与我遇到的其他未定义行为非常不同。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多