如何解决此C ++访问冲突问题?

时间:2019-07-26 01:37:43

标签: c++

以下代码中出现错误。写入_buf时,Visual Studio会引发访问冲突错误。我该如何解决?

Sendn函数是一个套接字发送函数。没问题,您可以忽略它。

似乎_buf指向0x00000000

我看到的错误消息是

0xC0000005: 0x00000000 : access violation
void ?????::?????(int number, string title)
{

    int titlesize = sizeof(title);
    int bufsize = 4 + 4 + 4 + titlesize;

    char *_buf = new char[bufsize];

    _buf = { 0 };

    // char _buf[bufsize] = { 0 }; (수정 내용)

    int commands = 3;

    int index = 0;
    memcpy(_buf, &commands, sizeof(int));
    index += sizeof(int);

    memcpy(_buf + index, &number, sizeof(int));
    index += sizeof(int);

    memcpy(_buf + index, &titlesize, sizeof(int));
    index += sizeof(int);
    for (int i = 0; i < titlesize; i++)
    {
        memcpy(_buf + index, &title[i], sizeof(char));
        index += sizeof(char);
    }

    Sendn(_buf, bufsize);

    delete[] _buf;

    return;
}

2 个答案:

答案 0 :(得分:2)

char *_buf = new char[bufsize];
_buf = { 0 };

这不会将_buf所指向的动态分配数组零填充。它将指针_buf设置为空指针。由于_buf是空指针,以后尝试对其取消引用会导致未定义的行为。

在这种情况下,无需对_buf所指向的数组进行零填充,因此只需删除_buf = { 0 };行即可。


一旦解决了这个问题,您就没有分配正确的内存量。 sizeof(title)不会给您title保留的字符数。它只是为您提供std::string对象的静态大小,该对象通常只是一个指针和两个整数。请改用title.size()

答案 1 :(得分:0)

您正在尝试将title的内容以及其他3个整数复制到_buf中,对吗?问题在于sizeof(title)不是存储在title中的字符串的长度。为了获得title的长度,您需要像这样在类型length上调用成员函数std::string

auto titlesize = title.length();

sizeof运算符仅提供堆栈上std::string对象的大小(相比之下,实际字符串存储在堆中),sizeof表达式始终是常量表达式。在我的计算机上,sizeof(std::string)是24,无论实际字符串是什么。