これは私のコードです。このエラーが発生しました。デストラクタに問題があると思います。これを説明してもらえますか?デストラクタはヒープの破損を引き起こします
#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;
}
}
出力はこれですここに画像の説明を入力してください
デストラクタの問題は何ですか?
あなたはJavaとC ++を混同していました。新しい式では、type-idの後に親に入るのは、割り当てられたブロックのサイズではなく、初期化子の一部です。
char *s = new char(3);
1文字を割り当て、それに3の値を割り当てます。
あなたが書かなければならなかったこと
char *s = new char[3];
この場合にのみ使用することが合法です delete[]
このようなポインタでは通常の削除を使用できません。ええと、できますが、通常はそうすべきではありません。なぜなら、それは未定義の振る舞いにつながるからです。たとえば、一部のプラットフォームではアレイ全体の割り当てを解除しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加