1

にエラーがある理由がわかりませんでしdelete[] *iopszString;た。修正を手伝ってもらえますか?

入力を試してください:1 3 aaa

最後の delete[] を省略すると、すべて機能しますが、ポインターを交換するために前のポイントを削除する必要があるため、意味がありません。 コード

// Notepad.cpp

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

// Method definition
void addText(char** iopszString);

void main()
{

    // Const definition
    int const ADD    = 1;
    int const UPDATE = 2;
    int const DELETE = 3;
    int const SAVE   = 4;
    int const EXIT   = 5;

    // Variable definition
    int nUserCode;

    // Code section

    // Gets the user code
    cout << "Enter the code: " << endl;
    cin >> nUserCode;

    // + "\0" so 1 minimum!!!
    char* iopszString = new char[1];
    iopszString = "";

    // Runs until the exit code
    while (nUserCode != EXIT)
    {
        // Checks the exit code
        switch (nUserCode)
        {
            case ADD:
            {
                addText(&iopszString);
                cout << iopszString << endl;
                break;
            }
            case UPDATE:
            {

                break;
            }
            case DELETE:
            {

                break;
            }
            case SAVE:
            {

                break;
            }
            default:
            {
                cout << "Wrong code, try again" << endl;

                break;
            }
        }

        // Gets the user code
        cout << "Enter the code: " << endl;
        cin >> nUserCode;
    }

    // Delete the string cuz heap
    delete[] iopszString;
}

void addText(char** iopszString)
{
    // Variables definition
    int  nAddLength;

    // Code section

    // Gets the new length
    cout << "Enter the length of the added string: " << endl;
    cin >> nAddLength;

    // Always remember - the length you want+1!!
    char* szNewString = new char[nAddLength+1];

    // Gets the new string
    cout << "Enter the new string which you want to add: " << endl;
    cin >> szNewString;

    // Creating a new string (result)
    char* szResult = new char[nAddLength+1+strlen(*iopszString)];

    // Copies the old string to the new
    strcpy(szResult, *iopszString);
    strcat(szResult, szNewString);

    // Deletes the new string cuz we already copied
    delete[] szNewString;

    // Exchange pointers 
    //strcpy(*iopszString, szResult); <--- never

    // The problem!
    delete[] *iopszString;

    // Exchange pointer 
    *iopszString = szResult;
}
4

1 に答える 1

6

バグは次の 2 行にあります。

char* iopszString = new char[1];
iopszString = "";

で新しいメモリを割り当てnew、その場所をポインタに保存しますiopszString。次に、文字列リテラルの場所をそのポインターに割り当てる""と、ポインター自体の値が変化します。それは今、あなたが割り当てておらず、あなたが所有していないメモリの場所を指していnewます。したがって、割り当てたメモリのポインターを失い (メモリ リーク)、delete[]の場所へのポインターを呼び出すと""、クラッシュしますdelete[]( new.

あなたはおそらく次のように書くつもりでした:

char* iopszString = new char[1];
iopszString[0] = '\0';

charこれは、割り当てた最初の値のみを設定する'\0'ため、有効な空のゼロ終了文字列に変換します。

于 2013-10-22T18:14:25.960 に答える