は、次のコードを考えてみましょう:C++で[]を削除します。
int main()
{
char* str = new char;
str[0] = 'a';
delete[] str; //Notice the []
}
それはコンパイル、実行し、何が(VC15とg ++)がクラッシュ しかし、私はvalgrindのをはっきりと見ることができる1つのメモリリークを持っています。
私はしかし、次のコードを実行した場合:
#include <iostream>
class Foo{
public:
Foo(){
std::cout << "Foo::Foo" << std::endl;
}
~Foo(){
std::cout << "Foo::~Foo" << std::endl;
}
};
int main()
{
Foo* foo = new Foo;
delete[] foo;
return 0;
}
を私は(〜20 D'TORS呼び出し後)は、Windows上で動作しているときデストラクタ呼び出しの無限ループを取得し、およびLinuxでの無効なポインタエラー。
私が理解できないことは、2つの違いがある理由です。 new char
またはクラッシュで無限ループが発生するのはなぜですか?
未定義の動作です。この種のバグを持つコードからは特に何も期待できません。 – juanchopanza
'undefined'とは何ですか?ポインタのdelete []? – ZivS
はい、 'new []'で割り当てられていないものに対して 'delete []'を呼び出します。 – juanchopanza