默认赋值运算符如何与字符串指针一起使用

问题描述

代码在运行期间是否会失败? Visual Studio可以成功执行它

#include<iostream>
#include <string>
using namespace std;

class Boy
{
    string* _name;
public:
    Boy(string n) :_name(new string(n)) {}
    string getName() const { return *_name; }
};
int main() {
    Boy t("Tom");
    string str = "Tom2";
    t = str;
    cout << t.getName();
        return 0;
}

解决方法

代码在运行期间是否会失败?

不,不应该。

我们来剖析一下以下内容:

t = str;

有一个隐式构造的临时Boy实例。因此,它仅与

相同
t = Boy(str);

operator=将在构造函数中生成的指针复制到t._name。 临时创建的Boy实例消失了,而没有删除内部管理的指针(应该如此)。

因此,您的代码可以正常运行而不会出现故障或未定义的行为(但会泄漏内存)。


以上所述,您真正应该做的是以下类声明:

class Boy {
    std::string name;
public:
    Boy(const std::string& n) : name(n) {}
    const std::string& getName() const { return name; }
};

,不再担心指针,内存管理以及所有这些东西,YAGNI。 std::string和c ++标准库提供的其他容器类旨在以有效,安全且不易出错的方式为您完成所有这些工作。