加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么我的结果数据返回为void *被破坏了?

发布时间:2020-12-16 05:50:25 所属栏目:百科 来源:网络整理
导读:我正在一个具有巨大遗留代码库的项目中工作,并且一直在尝试重新设计它的一部分以摆脱旧的C风格代码. 我遇到了一个问题并准备了一个简短的程序来解释. 我正在使用的遗留接口需要我将指向结果数据的指针作为void *传递,我想避免必须更改它. 示例中的unique_ptr
我正在一个具有巨大遗留代码库的项目中工作,并且一直在尝试重新设计它的一部分以摆脱旧的C风格代码.

我遇到了一个问题并准备了一个简短的程序来解释.

我正在使用的遗留接口需要我将指向结果数据的指针作为void *传递,我想避免必须更改它.

示例中的unique_ptr只是用于演示,在我的实际代码库中,处理数据的所有内容都使用智能指针来管理内存.

我的问题是,结果数据被破坏了(参见最后一行/最后一次调用printPayload);最后一切都是0,但是转换到void *并且如第2和第3输出线所示返回似乎没有问题.

这是一个与临时相关的问题吗?
我不明白……

我希望这种问题对你们中的一些人有意义.

#include <iostream>
#include <memory>

struct Payload
{
    long a;
    int b;
    int c;

    Payload() : a(),b(),c() {}
    Payload(long setA,int setB,int setC) : a(setA),b(setB),c(setC) {}
};

void printPayload(const Payload& printThis)
{
    std::cout << "payload -- a: " << printThis.a << " b: " << printThis.b << " c: " << printThis.c << std::endl;
}

void doSomething(Payload* sourceData,void* targetData)
{
    if (!sourceData) return;

    std::unique_ptr<Payload> sourceDataUnique(sourceData);

    sourceDataUnique->a = 222;
    sourceDataUnique->b = 333;
    sourceDataUnique->c = 444;

    printPayload(*sourceDataUnique);

    targetData = reinterpret_cast<void*>(sourceDataUnique.release());

    printPayload(*(reinterpret_cast<Payload*>(targetData)));
}

int main(void)
{
    Payload* myPayload = new Payload(14,8,1982);
    Payload myResult;

    printPayload(*myPayload);

    doSomething(myPayload,&myResult);

    printPayload(myResult);
}

输出:

payload -- a: 14 b: 8 c: 1982
payload -- a: 222 b: 333 c: 444
payload -- a: 222 b: 333 c: 444
payload -- a: 0 b: 0 c: 0

解决方法

targetData是doSomething的局部变量.为其分配地址后,它将超出范围.

你永远不会真正分配给myResult.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读