这是我的代码我有这个错误。我认为这是我的析构函数的问题。 你能解释一下这个吗? 析构函数导致堆损坏
#pragma once
#include<iostream>
class Adresa
{
char *nume;
int numar;
char *localitate;
public:
Adresa();
Adresa(char *n, int nr, char*l);
Adresa(Adresa &adr);
void print()
{
printf("%s %d %s ", nume, numar, localitate);
}
~Adresa();
};
和
#include "Adresa.h"
#include<iostream>
Adresa::Adresa()
{
nume = new char();
localitate = new char();
numar = NULL;
}
Adresa::Adresa(char *n, int nr, char*l)
{
this->nume = _strdup(n);
this->localitate = _strdup(l);
this->numar = nr;
}
Adresa::Adresa(Adresa &adr)
{
this->nume = new char(strlen(adr.nume) + 1);
strcpy(nume, adr.nume);
this->numar = adr.numar;
this->localitate = new char(strlen(adr.localitate) + 1);
strcpy(localitate, adr.localitate);
}
Adresa::~Adresa()
{
if (nume != NULL)
{
delete[] nume;
}
if (localitate != NULL)
{
delete[] localitate;
}
}
,输出就是这个 enter image description here
我的析构函数有什么问题?
答案 0 :(得分:1)
你混淆了java和C ++。在新的表达 什么进入父母AFTER类型是分配块的大小,它是部分初始化器。
char *s = new char(3);
分配一个字符并为其赋值3.
你必须写什么
char *s = new char[3];
仅在这种情况下使用delete[]
你不能在这样的指针上使用普通删除。嗯,你可以,但通常你不应该,因为它不会释放整个数组。