如何将 void* 用作单个变量持有者? (例如 void* raw=SomeClass() )
How to use void* as a single variable holder? (Ex. void* raw=SomeClass() )
我正在尝试让 void*
保存一个值(以避免调用默认构造函数)。
我想:-
- 将 K 复制到 void* 例如
K k1; --> void* raw=k1;
- 将 void* 复制到 K 例如
void* raw; --> 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 ( ),但没有找到如何将 void*
用于不是数组的变量。
C++ 对我来说是新的。
编辑 :
我正在编写一个非常自定义的集合(数组)。
每个元素都封装在自定义结构中 KCap kcap
(仅保留 1 个元素,即 K
)。
因此,我必须将 K k
声明为封装器的字段 KCap
.
但是,我想避免 K
的默认构造函数,所以我认为 void*
可以解决我的问题。
你试图做的事情没有意义。 void * 用于保存任意类型的指针,而不是任意类型的其他对象。如果要为任意对象类型使用存储,请使用 char[]
.
您的代码的其他问题包括您需要确保原始存储的正确对齐,使用 reinterpret_cast
引用而不是 static_cast
非引用,您的就地析构函数调用语法错误,并且您没有在 "raw" 存储中构造 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;
}
我正在尝试让 void*
保存一个值(以避免调用默认构造函数)。
我想:-
- 将 K 复制到 void* 例如
K k1; --> void* raw=k1;
- 将 void* 复制到 K 例如
void* raw; --> 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 ( ),但没有找到如何将 void*
用于不是数组的变量。
C++ 对我来说是新的。
编辑 :
我正在编写一个非常自定义的集合(数组)。
每个元素都封装在自定义结构中 KCap kcap
(仅保留 1 个元素,即 K
)。
因此,我必须将 K k
声明为封装器的字段 KCap
.
但是,我想避免 K
的默认构造函数,所以我认为 void*
可以解决我的问题。
你试图做的事情没有意义。 void * 用于保存任意类型的指针,而不是任意类型的其他对象。如果要为任意对象类型使用存储,请使用 char[]
.
您的代码的其他问题包括您需要确保原始存储的正确对齐,使用 reinterpret_cast
引用而不是 static_cast
非引用,您的就地析构函数调用语法错误,并且您没有在 "raw" 存储中构造 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;
}