c++,修改堆上的值VS delete和new



在c++书籍中的一个类示例中,赋值操作符重载如下行:

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

简单地改变已经分配的空间中的值有什么问题呢?

*m_pName = *(c.m_pName);

谢谢。

你的方法没有错。事实上,我会用它。

我甚至会问为什么有std::string*,为什么没有std::stringstd::optional<std::string>?

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

旁注:拥有原始的所属指针不是现代c++。最好使用像std::unique_ptr这样的智能指针。

简单地改变已经分配的空间中的值有什么问题?

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

所以,它归结为你正在尝试/应该做什么。这决定了你所做的是错还是对。考虑到你没有描述你想做什么,我不清楚为什么你认为建议的函数是错误的。


注:避免裸拥有指针。首选RAII类,如智能指针或容器。

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

那么总结一下,也许你实际上应该使用如下的东西:

struct example {
std::string name;
};

注意赋值操作符是隐式生成的。

最新更新