Bio*_*i3c 11 c c++ void-pointers realloc
在之前的一个问题中,我询问了类型转换指针,但是针对使用C++分配系统而不是mallocs的更好解决方案.(我正在将一些C代码转换为C++)
但是,我仍然遇到类似功能的问题:
我变了:
tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp];
Run Code Online (Sandbox Code Playgroud)
和
free(tmp) --> delete [] tmp;
Run Code Online (Sandbox Code Playgroud)
但是,我在以下函数中如何处理realloc:
char* space_getRndPlanet (void)
{
int i,j;
char **tmp;
int ntmp;
int mtmp;
char *res;
ntmp = 0;
mtmp = CHUNK_SIZE;
//tmp = malloc(sizeof(char*) * mtmp); <-- replaced with line below
tmp = new char*[mtmp];
for (i=0; i<systems_nstack; i++)
for (j=0; j<systems_stack[i].nplanets; j++) {
if(systems_stack[i].planets[j]->real == ASSET_REAL) {
ntmp++;
if (ntmp > mtmp) { /* need more space */
mtmp += CHUNK_SIZE;
tmp = realloc(tmp, sizeof(char*) * mtmp); <--- Realloc
}
tmp[ntmp-1] = systems_stack[i].planets[j]->name;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: invalid conversion from 'void*' to 'char**'|
Run Code Online (Sandbox Code Playgroud)
编辑2:
好的,我得到的共识是我应该抛弃我目前的解决方案(我愿意这样做).
为了确保我理解正确,你们是否意味着,而不是指向对象的指针数组,我应该只有一个包含对象本身的向量?
dan*_*n04 15
C允许void*隐式转换为任何指针.C++没有,所以如果你正在使用realloc,你必须将结果转换为适当的类型.
但更重要的是,使用realloc返回的指针new[]是未定义的行为.并且没有直接的C++风格等同于realloc.
您的选择至少是大多数惯用语:
malloc/ realloc/ free并投下指针.new[]+ delete[]代替reallocstd::vector<std::string>而不是管理自己的记忆.Nic*_*ght 13
这似乎是一个不起眼的阵列,可以根据需要增长.
停止使用显式内存分配,你几乎肯定不需要它.使用std::vector或另一个C++标准库的动态容器,根据需要自动增长.
它看起来像是使用以null结尾的C风格字符串.为什么std::string不用呢?
在C++中,您不应该使用数组(甚至是动态分配的).
这已被std :: vector取代
在C:
char** tmp = (char**)malloc(sizeof(char*) * size);
free(tmp);
// And a correct version of realloc
char** alt = (char**)realloc(sizeof(char*) * newSize);
if (alt)
{
// Note if realloc() fails then it returns NULL
// But that does not mean the original object is deallocated.
tmp = alt;
}
Run Code Online (Sandbox Code Playgroud)
在C++中
std::vector<char*> tmp(size);
// No need for free (destructor does that).
tmp.resize(newSize);
Run Code Online (Sandbox Code Playgroud)