gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:00:26 25 4
gpt4 key购买 nike

我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com