C++,修改堆上的值 VS 删除和新建

C++, modify value on the heap VS delete and new

在 C++ 书籍的 class 示例中,赋值运算符的重载如下:

delete m_pName;
m_pName = new string(*(c.m_pName));

有什么问题,相反,只需更改已分配的值 space?

*m_pName = *(c.m_pName);

谢谢。

你的做法没有问题。事实上我会用它。

我什至会质疑为什么有std::string*,为什么没有std::stringstd::optional<std::string>

我看到的唯一区别是原始代码确保释放内存并重新分配内存。您的方法可能会重用已分配的内存,而不是释放额外的 space 已分配且现在不再需要的内存(因为新字符串更短)。

旁注:原始拥有指针不是现代 C++。最好使用像 std::unique_ptr.

这样的智能指针

What is wrong with, instead, simply change the value in the already allocated space?

它做了(稍微)不同的事情。如果那个不同的事情不是函数应该做的,那么它就是错误的事情。

所以,这归结为您 trying/supposed 要做的事情。这决定了你所做的是错误的还是正确的。鉴于您没有描述您正在尝试做什么,因此不清楚为什么您认为建议的功能是错误的。


P.S。避免裸拥有指针。更喜欢 RAII 类,例如智能指针或容器。

P.P.S。避免不必要的动态分配。几乎不需要动态分配 std::string.

所以总而言之,也许您实际应该使用的是如下内容:

struct example {
    std::string name;
};

请注意,赋值运算符是隐式生成的。