在析构函数中检测到堆损坏

时间:2017-08-04 14:23:43

标签: c++

这是我的代码我有这个错误。我认为这是我的析构函数的问题。 你能解释一下这个吗? 析构函数导致堆损坏

 #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

我的析构函数有什么问题?

1 个答案:

答案 0 :(得分:1)

你混淆了java和C ++。在新的表达  什么进入父母AFTER类型是分配块的大小,它是部分初始化器。

char *s = new char(3);

分配一个字符并为其赋值3.

你必须写什么

char *s = new char[3];

仅在这种情况下使用delete[]

是合法的

你不能在这样的指针上使用普通删除。嗯,你可以,但通常你不应该,因为它不会释放整个数组。