【问题标题】:How to cast a function input to a smart pointer in c++?如何将函数输入转换为 C++ 中的智能指针?
【发布时间】:2014-10-28 02:22:41
【问题描述】:

我正在使用一个以“void* fdata”作为输入之一的函数。我定义了一个名为data2的结构体,可以通过&alldata2将定义的结构体变量传递给函数,其中alldata2是data2下定义的结构体变量的名称。

我的问题是如何将 f(..., void* fdata,...) 中的输入转换为函数 f 主体中的智能指针?函数 f 在一个循环中,我还在循环中使用了“#pragma omp parallel for the num_threads(3)”。

我可以在函数中使用以下命令创建指向 alldata2 的原始指针,称为 dp2:

double f(..., void* fdata, ...)
{
data2* dp2 =  (data2 *)(fdata);
...
}

但该程序似乎存在内存泄漏,我怀疑这是由于在函数 f 的递归评估中创建 dp2 造成的。任何帮助将不胜感激!我正在使用 Visual Studio 2012 Express。

我尝试过但不起作用的一些方法包括:

  1. 在函数中写

    data2* dp2 = new data2();
    dp2 = (data2*)(fdata);

然后在“return”命令之前删除 dp2。

  1. std::unique_ptr *dp2(static_cast(fdata))

【问题讨论】:

  • 除非你在处理 C 接口,否则不要使用void *。如果您不能使用模板并想删除类型信息,则可以使用 std::shared_ptr<void> 之类的东西
  • 重新>,为什么?这通常不是一个好主意。也就是说,你遇到了问题。
  • std::unique_ptr<data2> dp2(reinterpret_cast<data2*>(fdata));
  • @BryanChen。谢谢!这可能是解决它的一种方法。稍后再试。
  • @Cheersandhth.-Alf 这只是将数据传递给函数的一种方式。

标签: c++ smart-pointers void-pointers


【解决方案1】:

我意识到我想要的只是访问函数 f(..., void* fdata,...) 中 void 指针的内容。

通过将函数中的指针 dp2 替换为 ((data2*)(fdata)),程序可以在不创建指针的情况下运行。与指针相关的可能的内存泄漏问题消失了。

再次感谢所有回复的人:)

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 2011-06-14
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多