替换realloc(C - > C++)

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[]代替realloc
  • 使用std::vector<std::string>而不是管理自己的记忆.


Nic*_*ght 13

这似乎是一个不起眼的阵列,可以根据需要增长.

停止使用显式内存分配,你几乎肯定不需要它.使用std::vector或另一个C++标准库的动态容器,根据需要自动增长.

它看起来像是使用以null结尾的C风格字符串.为什么std::string不用呢?


Mar*_*ork 5

在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)