繁体   English   中英

删除数组时断言失败

[英]Assertion failure when deleting array

我正在使用以下代码:

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;
}

每当我遇到断言失败时。 在这里,我读到要取消分配数组,必须使用delete[]而不是delete 因此,我更正了我的代码,仍然遇到了完全相同的错误。 这个论坛上,我读到我要删除的指针不得更改。 我用cout << (int)serial;检查了指针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个以上的char,则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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM