【发布时间】:2016-03-25 07:48:25
【问题描述】:
每当一个字符串析构函数被击中它触发一个断点,我想我可能会删除相同的变量两次,或者在操作 m_str 期间没有分配正确的内存量
#include "String.h"
#include <iostream>
using namespace std;
String::String()
{
m_str = nullptr;
}
String::String(const char* newStr)
{
m_str = new char[strlen(newStr)+ 1];
strcpy(m_str, newStr);
}
String::~String()
{
if (m_str != nullptr)
{
delete[] m_str;
}
}
void String::operator=(const String & myString)
{
if (m_str != nullptr)
{
delete[] m_str; //Breakpoint Apears Here
};
m_str = new char[strlen(myString.m_str) + 1];
m_str = myString.m_str;
}
void String::operator=(char* newStr)
{
if (m_str != nullptr)
{
delete[] m_str;
};
m_str = new char[strlen(newStr) + 1];
m_str = newStr;
}
}
【问题讨论】:
-
你的问题是什么?
-
您必须有一个复制构造函数,对于包含这样类型的资源,移动构造函数和赋值运算符将是非常可取的。 (移动构造函数:`String(String&&rhs):m_str(rhs.m_str){rhs.m_str = nullptr;}')。
-
检查三规则和五规则
-
另外注意:不需要检查指针是否为nullptr,直接调用delete[] m_str;因为您可以删除 nullptr 的(然后它什么也不做)。在您的 c'tor 中,您可以使用 String::String() 直接初始化您的成员: m_str(nullptr) 或 String::String(const char* newStr) : m_str(new char[strlen(newStr)+ 1])等等。顺便说一句,检查其他字符串实现也可能会有所帮助,例如 std lib 的实现。
-
请完成你的例子,以便大家编译。确保您不包含不必要的内容,它应该是一个最小但完整的主题示例。
标签: c++