调试断言失败-找不到错误代码

Debug Assertation Failed - Dont find bad code

本文关键字:找不到 错误代码 失败 断言 调试      更新时间:2023-10-16

我写了一个类来适应C++。当我尝试删除对象时,调试器抛出一个"调试断言失败",其中包含_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)。

也许有人可以向我展示我调试所有内存地址时的错误。

行.h

#ifndef LINES_H
#define LINES_H
#include <stdio.h>
#include <iostream>
using namespace std;
class Lines
{
public:
    Lines(int _laenge) : fuellzeichen{ '#' }, name{ "Hans-Peter" }, laenge{ _laenge }{};
    Lines(int _laenge, char _fuellzeichen) : fuellzeichen{ _fuellzeichen }, laenge{ _laenge }, name{ "Hans-Peter" }{};
    Lines(int _laenge, char _fuellzeichen, char* _name) : fuellzeichen{ _fuellzeichen }, laenge{ _laenge }, name{ _name }{};
    Lines(const Lines& _l);
    ~Lines();
    Lines& operator= (const Lines & _l);
private:
    char fuellzeichen;
    int laenge;
    char* name;
};

#endif // LINES_H

行.cpp

#include "Lines.h"
Lines::Lines(const Lines& _l){
    fuellzeichen = _l.fuellzeichen;
    laenge = _l.laenge;
    int len = strlen(_l.name) + 1;
    name = new char[len];
    strncpy(name, _l.name,len);
}
Lines& Lines::operator=(const Lines& _l){
    if (this == &_l){
        return *this;
    }
    Lines tmp(_l);
    swap(fuellzeichen, tmp.fuellzeichen);
    swap(name, tmp.name);
    swap(laenge, tmp.laenge);
    return *this;
}
Lines::~Lines(){
    delete[] name;

}

main.cpp

#include "Lines.h"
    int main(int argv, char* args[]){
        Lines a(20,'#');
        Lines b(a);
}

不要delete []你没有new []

Lines(int _laenge) : fuellzeichen{ '#' }, name{ "Hans-Peter" }, laenge{ _laenge }{};
Lines(){ delete[] name; }

看看上面两行:

  • ctor将name指向字符串文字"Hans-Peter"
  • delete []name所指向的任何数据

最简单、最好的补救方法是使用std::string,而不是自己进行内存管理
这也将允许你遵循零规则,而不是三分之一规则。

还有一个错误,或者至少还有一个错误正在等待发生:您的一个参数ctor应该是explicit,因此不考虑隐式转换。

顺便说一句,考虑使用默认参数来简化代码
此外,在适当的情况下使用const

explicit Lines(int _laenge, char _fuellzeichen = '#', const char* _name = "Hans-Peter")
        : fuellzeichen{_fuellzeichen}, laenge{ _laenge } {
    int len = strlen(_name)+1;
    name = new char[len];
    memcpy(name, _name, len);
};

当您使用复制和交换进行赋值时,请考虑编写免费函数swap并传递值:

Lines& Lines::operator=(Lines _l) { swap(this, &_l); return *this; }
void swap(Lines& a, Lines& b) {
    using std::swap;
    swap(a.fuellzeichen, b.fuellzeichen);
    swap(a.name, b.name);
    swap(a.laenge, b.laenge);
}

~Linesoperator=可能应该在类中定义,而swap必须在该标头中声明。)