首页 > 解决方案 > c ++:堆栈上的数据而不对其进行初始化

问题描述

我想创建一个使用签名函数的适配器,void convert(void* input, T* out, int* ok)其中 T 被重载为任何类型,并ok指示是否发生错误(提供了这些函数,我无法更改它们的主体)。模板内的功能片段:

template<typename T>
T convert_adapter(void* input){
    T result;
    int ok = 1;
    convert(input, &result, &ok);
    if (!ok)
        throw Exception("error during conversion");
    return result;
}

这对于像 int 和简单结构这样的类型足够好,但在没有默认构造函数的更复杂的类和结构上失败,因为result不能在第一行默认初始化。问题是,如果 中发生错误convert,我不会使用result,如果没有发生错误,则会自行convert分配一个初始化值( ),因此我永远不需要实际初始化自己。result*out = {...}result

如何提供convert指向适当类型的未初始化数据的指针?我知道我可能可以用 a 来做到这一点char[sizeof(T)],但我想知道是否有更优雅的解决方案。

编辑:我现在看到这个问题违背了 C++ 的一些基本概念,我将尝试与提供者交谈convert以找到解决方案。我会把这个问题留给后代。

标签: c++memory

解决方案


(*out = {...})这不会初始化。

赋值和初始化不是一回事。在您寻求优化的情况下,分配给未初始化的数据是 UB。

您可以放置​​ new 进行初始化,但由于您无法更改转换的主体,因此这是不允许的。


推荐阅读