C++上有 malloc 的字符串数组

Array of strings with malloc on C++

本文关键字:字符串 数组 malloc 上有 C++      更新时间:2023-10-16

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

您已经可以将任何指向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中的字符串(因为这是指针指向的内容)。

void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
  ((string*) TP)[i] = Token[i];
}

这太可怕了,但我会忽略它并解释为什么它坏了以及如何让它工作......

malloc()分配内存,但不在其中构造任何对象。 对于string,您需要调用构造函数 - 否则新的string实例将包含未初始化的指针成员,string对象将假定这些成员是指向实际文本数据的内存的指针: 然后,((string*) TP)[i] = Token[i];将尝试确保容量并根据这些垃圾值覆盖内存。

若要解决此问题,请使用 placement-new 运算符构造每个字符串:

void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
  new (&((string*)TP)[i]) std::string(Token[i]);
}

之后,您需要通过显式调用它们的析构函数来销毁string,然后free()数组。