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

时间:2014-11-04 17:36:07

标签: c++ class copy-constructor

我已经编写了一个习惯于C ++的类。当我尝试删除对象时,调试器会使用_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)抛出“Debug Assertation Failed”。

也许有人可以告诉我在调试所有内存地址接缝时的错误。

Lines.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

Lines.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);
}

1 个答案:

答案 0 :(得分:2)

{not} delete []不要new []

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

看看以上两行:

  • ctor将name指向字符串文字"Hans-Peter"
  • dtor delete [] s name指向的任何内容。

最简单和最好的补救措施是使用std::string而不是自己进行记忆管理 这也可以让你遵循零规则而不是3规则。

还有一个 bug ,或者至少是等待发生的bug:你的one-argument-ctor应该是explicit,所以不考虑隐式转换。

另外,请考虑使用default-arguments来简化代码 另外,在适当的地方使用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。)