c++ - 将两个字节变为短字节时堆损坏。 C++

标签 c++ pointers memory dealloc heap-corruption

我正在用 C++ 开发一个程序,当我运行这段代码时遇到了这个错误:

short readshort() {
    short val=0;
    (&val)[1]=data.front(); data.pop_front();
    (&val)[0]=data.front(); data.pop_front();
    return val;
}

这是我得到的错误:

Run-Time Check Failure #2 - Stack around the variable 'val' was corrupted.

我现在应该提一下,“数据”是用 std::list 数据定义的;

我想我知道问题出在哪里,但我想不出一个简单的解决方案。我认为这个错误是由存储在堆栈中的“val”引起的,而不是作为指针。当我尝试通过“val”访问数据指针时出现此错误。

我想到的解决方案是这样分配“val”:

short readshort() {
    short* val=new short;
    val[1]=data.front(); data.pop_front();
    val[0]=data.front(); data.pop_front();
    return *val;
}

但是我找不到一种方法可以在我返回“val”后删除它,而不必每次都在函数外删除它。 有没有一种方法可以在没有内存泄漏的情况下在 C++ 中完成?我之前没有看到有人使用“(&val)[1]”将变量类型(例如短)拆分为字节,我想知道这是不是因为它引起了一些问题,或者它只是不是一个已知的方法?

回到真正的问题,如何将这两个字节变成short(或large数据类型)?还有比我尝试过的更好的方法吗?

最后一件事,我知道 java 有一个自动清理内存泄漏的自动垃圾收集器。 C++ 是否提供相同类型的设备?我听说过一些关于智能指针的事情,但我不知道它们是什么 ;)

最佳答案

这是安全和简单的:

int16_t readshort()
{
    union { int16_t s; char val[2]; } u;
    u.val[1]=data.front(); data.pop_front();
    u.val[0]=data.front(); data.pop_front();
    return *(int16_t*)u.val;
}

关于c++ - 将两个字节变为短字节时堆损坏。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168334/

相关文章:

c - 当我溢出分配的字符数组时,为什么我的 C 程序不会崩溃?

c++ - 我在 DLL 项目 C++ 中收到 "nonstatic member reference must be relative to specific object"错误

c++ - 从工厂类创建对象名称的 undefined reference

c++ - 在使用 Visual Studio 2005 调试时调用函数?

c++ - 从 C++ 中的函数返回数组

c++ - 如果已知 void* 分配大小,如何将确切的内存大小传递给 free()

c# - 如何在 Windows 窗体 C# 中将大量数据保存在内存中

c++ - 比较警告

c - C 中 char 指针的问题

c# - C#数组如何处理内存?