C++上有 malloc 的字符串数组
Array of strings with malloc on C++
出于我无法控制的原因列表,我需要创建一个需要从 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()
数组。
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组