c++ - 删除数组时断言失败

标签 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 (无论何时何地)我都断言失败。我做错了什么吗?

最佳答案

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

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

您只为每个变量分配了一个字符。 [] 之间的数字是要分配多少个元素,在本例中是多少个 wchar_t

发生的事情是,没有什么能阻止用户在调用时向 user[]/serial[] 写入更多字符:

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

wscanf 不对数组进行边界检查。如果用户在终端中写入超过 1 个字符,wscanf 将在数组边界之外写入,破坏程序的内存空间并在该内存稍后被释放并随后被验证时触发断言通过 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::stringstd::wstring。此外,对于终端/控制台 IO,更喜欢 std::coutstd::wcout

关于c++ - 删除数组时断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171867/

相关文章:

PHP array_map trim + 参数

c++ - 项目 : C vs C++ 中包含多个相同的头文件

c++ - 模板特化不明确

c++ - 是否可以手动分解 C++ 符号?

javascript - 为什么我不能使用 array == [] 检查数组是否为空?

python - 如何增加 numpy int32 数组的维度?

Java:如何检查二维列表/数组中的 boolean 条件?

java - 方法应该检查数组自身吗?

c++ - 未调用 std::unique_ptr 中的自定义删除器

c++ - Qt 编译 - 在 Windows 上使用 qmake