有关我无法控制的原因列表,我需要创建一个需要从void *指针引用的字符串数组。我的想法是在C ++中遵循以下模式:
void* TP = malloc(sizeof (double) * SS);
for (int i = 0; i < SS; i++) {
((double*) TP)[i] = IStringToDouble(Token[i]);
}
其中Token是向量而SS是int。现在,使用该模板,我开始使用类似的东西:
void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
((string*) TP)[i] = Token[i];
}
我知道这是非常错误的,但我尝试从它开始的所有修改都不起作用。
有关如何实现这一目标的任何建议?有可能吗?
我已经浏览了我在Google或StackOverflow上找到的关于C ++上的字符串数组的所有文档,但是没有一篇文章涵盖了从void *引用数组的问题。
答案 0 :(得分:4)
您可以将任何指针转换为void*
。您不需要使用malloc
,而不需要将void*
指针作为指向对象的唯一指针。
考虑到这一点,为什么不这样做?
string* TP = new string[SS];
for (int i = 0; i < SS; i++) {
TP[i] = Token[i];
}
void *TP2 = TP;
甚至是这样:
void *TP = &Token[0];
虽然,使用第二种方法,如果向Token
添加更多元素,指针将无效,并且通过此指针修改字符串将修改Token
中的字符串(因为&#39;指针指向的是什么。
答案 1 :(得分:1)
void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
((string*) TP)[i] = Token[i];
}
这太可怕了,但我会忽略它并解释它为什么会被破坏以及如何使它发挥作用......
malloc()
分配内存,但不构造任何对象。对于string
,您需要调用构造函数 - 否则新的string
实例将包含未初始化的指针成员,string
对象将假定它们是指向实际文本数据的内存的指针:{{然后,将尝试确保容量并根据这些垃圾值覆盖内存。
要解决此问题,请使用placement-new运算符构造每个字符串:
((string*) TP)[i] = Token[i];
之后你需要通过明确地调用它们的析构函数来销毁void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
new (&((string*)TP)[i]) std::string(Token[i]);
}
,然后string
数组。