【问题标题】:Windows Triggers Breakpoint on Array DeletionWindows 在数组删除时触发断点
【发布时间】: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++


【解决方案1】:

像您一样将一个const char * 分配给另一个,例如在赋值运算符中不复制字符串,它只是复制指针。因此,您现在有两个指针,而不是两个单独的字符串,指向同一个字符串。

因此,一方面,您正在泄漏新创建的 char 数组,其次,您试图删除已传递给赋值运算符的任何内容,在您的情况下,这可能是字符串文字,而不是通过 new 创建的内容。同样在复制赋值运算符的情况下,您最终会得到两个 String 对象指向同一个 char 数组,因此会被双重删除。

要解决这个问题,只需像在构造函数中那样使用strcpy

【讨论】:

    【解决方案2】:

    您正确地使用了strcpyString::String(const char* newStr) 中的原始字符数组复制字符,但在代码中的所有其他地方,您错误地编写了:

    m_str = new char[strlen(myString.m_str) + 1];
    m_str = myString.m_str;
    

    第一行正确分配了一个正确大小的数组,但第二行擦除了 new so 获得的指针:

    • 您会遇到内存泄漏,因为分配的内存上不再有指针并且永远不会被释放
    • m_str 成员指向原始 char 数组。如果它稍后被删除,您有一个悬空指针,如果您先删除此实例,您将尝试删除另一个实例中的原始 char 指针使其悬空,甚至尝试删除静态或本地数组。

    TL/DR:始终使用strcpy(或std::copy复制字符数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多