2

以下のコードで作成された.exeをデバッグモードで実行すると、アサーションエラーが表示され、プログラムがクラッシュします。ただし、以下のコードのリリースモードで作成された同じexeを実行すると、正常に動作します。

デバッグモードではアサーションエラーが発生するが、リリースモードでは発生しない理由を特定するのに役立ちます。

#include<iostream>
using namespace std;
#include<string.h>

void main()
{
    char *buf  = new char[5];   //pre-allocated buffer
    buf = "Hello";
    delete [] buf;
    getchar();
    //cout<<buf;
    //string *p = new (buf) string("hi");  //placement new
    //string *q = new string("hi");  //ordinary heap allocation
}
4

6 に答える 6

4
  1. void main間違っている。mainを返しますint。例外なし。
  2. あなたはやっていdelete[] "Hello"ます。"Hello"文字列リテラルです。あなたはそれをすることはできませんdelete
于 2012-11-29T13:34:52.587 に答える
4
 char *buf  = new char[5];   //pre-allocated buffer

ここでは、ポインターを定義し、5文字のスペースがある動的に割り当てられたバッファーを指すようにポインターを初期化します。

buf = "Hello";

ここでは、文字列リテラルの先頭を指すようにポインタを初期化します。

 delete [] buf;

ここで、bufポインターを削除しますが、bufポインターは、新しく作成したものを指しなくなり、文字列リテラルを指します。new /new[]から取得したものを指すポインタのみを削除/削除[]できます。そのため、未定義の動作が発生し、クラッシュする可能性があります

文字列の内容をnew[]したバッファにコピーするつもりだった可能性があります。nulターミネータを考慮することを忘れないでください。

int main()
{
    char *buf  = new char[6];   //pre-allocated buffer
    strcpy(buf, "Hello");
    delete [] buf;
    getchar();
    //cout<<buf;
    //string *p = new (buf) string("hi");  //placement new
    //string *q = new string("hi");  //ordinary heap allocation
}

ただし、C ++では、std ::stringfrom #include <string>;を使用する方がよいでしょう。

std::string = "Hello";
于 2012-11-29T13:35:06.293 に答える
2
 char *buf  = new char[6];   //pre-allocated buffer
 strncpy(buf, "hello", 6);
 delete [] buf;

buf = "hello"; bufの値をポインタから新しいchar[6]に変更します。ポインタが「hello」(ヒープにないメモリのブロック)を指すようにします。

于 2012-11-29T13:35:33.220 に答える
2

未定義の動作は、何かが起こる可能性があることを意味するためです。問題はbuf = "Hello"、文字列リテラルのアドレスをに割り当ててからbuf、そのリテラルを削除しようとすることです。デバッグモードでコンパイルすると、チェックコードはアドレスを削除できないことを確認します。リリースモードでは、チェックは行われず、削除は重要ではないものを踏みにじるだけです。

于 2012-11-29T13:35:50.070 に答える
2

文字列リテラルの割り当てを解除しようとしています"Hello"。この行:

buf = "Hello";

ポインタ bufをリテラルを指すようにリダイレクトします"Hello"。あなたはおそらくこれをするつもりでした:

char *buf = new char[6]; //need one extra space for terminating NUL character
strcpy(buf, "Hello");
于 2012-11-29T13:36:47.733 に答える
2

これを行うとき:

buf = "Hello";

は文字列リテラルであり、したがって読み取り専用メモリに格納されるため、基本的bufに読み取り専用メモリ領域を指すポインタ値(メモリアドレス)を変更します。"Hello"

次に、そのメモリを解放しようとすると、クラッシュします。

また、"Hello"5バイトではなく6バイトの長さです。

于 2012-11-29T13:34:45.597 に答える