我正在建立一个使用void *作为存储方法的类。我知道使用void *不是一个好主意。但是我不知道在编译时它将具有什么价值,所以我认为这是最好的解决方案。它适用于所有内容,包括C字符串,但不适用于std :: string。这会导致非常严重的内存泄漏。我建立了具有相同问题的类的基本模型。
#include<iostream>
#include<string>
class CLASS {
public:
void* data;
CLASS(std::string str) {
std::string* s = new std::string;
*s = str;
data = s;
}
~CLASS() {
delete data;
}
};
int main() {
std::string str = "hi";
while (true)
{
CLASS val(str);
}
}
如果分配了string
,将指针转换为void *
,然后删除该指针,则将尝试删除一个void
东西,而不是一个string
东西。例如,任何分配辅助存储的类(在使用所创建的实际对象之上和之外new
)都很可能会遇到麻烦:
#include <iostream>
class Y {
public:
Y() { std::cout << "y constructor\n"; }
~Y() { std::cout << "y destructor\n"; }
};
class X {
public:
X() { std::cout << "x constructor\n"; y = new Y(); }
~X() { delete y; std::cout << "x destructor\n"; }
private:
Y *y;
};
int main() {
X *x = new X();
delete (void*)x;
}
此代码在合法的情况下将“起作用”,但不会达到您的期望:
x constructor
y constructor
一个不错的编译器应该警告您:
program.cpp: In function ‘int main()’:
program.cpp:19:19: warning: deleting ‘void*’ is undefined [-Wdelete-incomplete]
19 | delete (void*)x;
| ^
您应该删除分配的类型,以确保使用正确的析构函数。换句话说,摆脱上面显示的代码中delete
的强制类型转换(以便您使用正确的类型)会更好:
x constructor
y constructor
y destructor
x destructor
现代C ++具有类型安全的类型,这些类型将为您带来繁重的工作,例如variant
或any
(如果您的单个类需要存储运行时决定的各种类型)或模板(如果可以用于一种类型,任何一种)。您应该调查这些内容以替代void *
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句