我已经编写了一个习惯于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);
}
答案 0 :(得分:2)
{not} delete []
不要new []
!
Lines(int _laenge) : fuellzeichen{ '#' }, name{ "Hans-Peter" }, laenge{ _laenge }{};
Lines(){ delete[] name; }
看看以上两行:
name
指向字符串文字"Hans-Peter"
。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);
}
(~Lines
和operator=
应该在类中定义,并且必须在该标头中声明swap
。)