删除数组时断言失败

时间:2014-08-06 23:21:26

标签: c++ arrays

我正在使用以下代码:

int main () {
    wchar_t *serial = new wchar_t[1];
    wchar_t *user = new wchar_t[1];
    size_t strLen;

    do {
        wprintf (L"Username (between 4 and 30 characters): ");
        wscanf (L"%ls", user);
    } while ((strLen = wcslen (user)) < 4 || strLen > 30);

    wprintf (L"Serial key: ");
    wscanf (L"%ls", serial);

    std::getchar ();
    std::getchar (); // Twice, because of trailing \n of wscanf()

    delete[] serial; // Error!
    delete[] user;

    return 0;
}

每次我都得到断言失败。 Here我读过如果我想释放数组,我必须使用delete[]而不是delete。所以我纠正了我的代码并且仍然得到完全相同的错误。在this论坛中,我读到我要删除的指针不得更改。我用cout << (int)serial;检查了我的指针,打印的数字没有变化。 如何解除分配数组?每次我使用delete(无论何时何地)我都会遇到断言失败。我做错了吗?

1 个答案:

答案 0 :(得分:4)

释放内存的方式没有任何问题,问题在于您分配和使用它的方式:

wchar_t *serial = new wchar_t[1];
wchar_t *user = new wchar_t[1];

您为每个变量分配了一个char。 []之间的数字是要分配的元素数量,在这种情况下是wchar_t s。

在接下来的调用中,没有什么可以阻止用户在user[]/serial[]中编写更多字符:

wscanf (L"%ls", user); 
wscanf (L"%ls", serial);

wscanf不对数组进行边界检查。如果用户在终端中写入多于1个字符,wscanf将在数组的边界外写入,破坏程序的内存空间并在稍后释放该内存并由{{{{}验证时触发断言。 1}}。

建议修复:

delete[]

尽可能使用#include <cstdio> #include <iostream> #include <string> int main() { std::wstring serial; std::wstring user; size_t strLen = 0; do { std::wcout << L"Username (between 4 and 30 characters): "; std::wcin >> user; } while ((strLen = user.length()) < 4 || strLen > 30); std::wcout << L"Serial key: "; std::wcin >> serial; std::getchar(); std::wcout << L"User....: " << user << std::endl; std::wcout << L"Serial..: " << serial << std::endl; return 0; } std::string避免使用原始指针。此外,对于终端/控制台IO,首选std::wstringstd::cout