c++ - 如何将 void* 用作单个变量持有者? (例如 void* raw=SomeClass() )

标签 c++ void-pointers

我正在尝试让 void* 保存一个值(以避免调用默认构造函数)。

我想:-

  • 将 K 复制到 void* 例如K k1; --> void* raw=k1;
  • 将 void* 复制到 K 例如无效*原始; --> K k2=raw;
  • 尽量不要破坏析构函数导致内存泄漏
  • 不要使用任何动态分配(堆、性能原因)

这是我尝试过的:-

class K{
    public: std::string yes="yes"   ;
};

int main() {
    //objective:  k1->raw->k2  , then delete "raw"
    void* raw[sizeof(K)];        //<--- try to avoid heap allocation
    K k1;
    static_cast<K>( raw)=k1;     //<--- compile fail
    K k2= static_cast<K>( raw);
    std::cout<<k2.yes;           //test
    static_cast<K&>(raw)::~K();  //mimic destructor
    return 0;
}

问题:请提供一个有效的代码来证明正确的方法。

我找到了如何使用 placement new ( https://stackoverflow.com/a/4756306/3577745 ),但没有找到如何将 void* 用于不是数组的变量。

C++ 对我来说是新的。

编辑:
我正在编写一个非常自定义的集合(数组)。
每个元素都封装在一个自定义结构KCap kcap中(只保留1个元素,即K)。
因此,我必须将 K k 声明为封装器 KCap 的字段。
但是,我想避免 K 的默认构造函数,所以我认为 void* 可以解决我的问题。

最佳答案

您尝试做的事情没有意义。 void * 用于保存任意类型的指针,而不是任意类型的其他对象。如果您想为任意对象类型使用存储,请使用 char[]

您的代码的其他问题包括您需要确保原始存储的正确对齐,对引用使用 reinterpret_cast 而不是对非引用使用 static_cast,您的就地析构函数调用语法错误,并且您没有在“原始”存储中构造 K 对象。这是更正后的版本:

#include <string>
#include <iostream>

class K{
    public: std::string yes="yes"   ;
};

int main() {
    //objective:  k1->raw->k2  , then delete "raw"
    alignas(alignof(K)) char raw[sizeof(K)];        //<--- try to avoid heap allocation
    K k1;
    new (reinterpret_cast<K *>(&raw)) K(k1);     //<--- compile now succeeds :)
    K k2= reinterpret_cast<K &>(raw);
    std::cout << k2.yes << std::endl;           //test
    reinterpret_cast<K&>(raw).K::~K();  // call destructor
    return 0;
}

关于c++ - 如何将 void* 用作单个变量持有者? (例如 void* raw=SomeClass() ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605120/

相关文章:

c++ - 运算符问题 ==

C++ 在数组中查找一个整数

c++ - 为什么可以将整数类型转换为指针?

c - 如何编写与MISRA:2012完全兼容的memcpy函数?

c++ - 什么是 C++ 中的空指针?

c# - 从 C++ 回调到 C#

c++ - 为什么 std::enable_shared_from_this 允许多个 std::shared_ptr 实例?

c++ - 通过名称查找进程ID的快速方法

c - 错误 : invalid conversion from 'void (*)(...)' to 'void (*)()'

c - 使用 memcpy 和 void* 交换函数