1

我正在用 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)拆分为字节,我想知道这是因为它引起了许多问题,还是它不是一种已知的方法?

回到真正的问题,我怎样才能把这两个字节变成短(或大数据类型)?还有比我尝试过的更好的方法吗?

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

4

4 回答 4

2

这是安全和简单的:

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;
}
于 2013-03-01T23:11:24.977 回答
1

您需要将指针转换为 char*。

((char *)(&val))[1]=data.front();
((char *)(&val))[0]=data.front();

我认为在你的情况下: (&val)[1]=data.front(); 您将数据写入第二个短路。结果你得到错误。

于 2013-03-01T23:11:34.103 回答
1

(&val)[1]=data.front()(&val)[1]您正在将下一个内存位置写入val未定义的错误。

(&val)[i]意味着=这很好*(&val + i )
(&val)[0]意味着= 但这是错误的,因为您的声明是这样我们只能访问 val 位置。*(&val + 0 )*(&val)
(&val)[1]*(&val + 1 )short val

+----+----+----+---+---+----+----+----+---+----+ 
|val      |        |
+----+----+----+---+---+----+----+----+---+---+----+  
 201   202  203 204 205 206  207   208 209 210  211
  ^           ^ 
   |          |
 &val         (&val + 1) 
              its not defined.   

你可以像@Carl Norum 建议的那样使用tyoecase。我只是在写第二种形式来做到这一点。

char *ptr = (char*)&val;

ptr[0]=data.front()
ptr[1]=data.front()

但是,如果您需要val很短并且想要访问单个字节。我想建议union

union Data{
 short val;
 char ch1;
 char ch2;
};

union Data d; 

d.ch1 = data.front()
d.ch2 = data.front()
于 2013-03-01T23:08:36.437 回答
0

(&val)[1]访问您没有分配的内存。Bam - 未定义的行为。你的两个例子都有同样的问题。

如果要像这样拆分字节,则需要使用char指针来访问各个字节:

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

不过,这段代码真的很丑。为什么不只是:

short readshort() {
    short val=0;
    val  = data.front() << 8; data.pop_front();
    val |= data.front() << 0; data.pop_front();
    return val;
}

根据字节顺序,您可能需要交换8and的位置0

于 2013-03-01T23:07:32.400 回答