在C ++上使用malloc的字符串数组

时间:2015-01-20 02:18:43

标签: c++ arrays string malloc void

有关我无法控制的原因列表,我需要创建一个需要从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 *引用数组的问题。

2 个答案:

答案 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数组。