替换realloc(C – > C ++)

在之前的一个问题中,我询问了类型转换指针,但是针对使用C ++分配系统而不是mallocs的更好解决方案。 (我正在将一些C代码转换为C ++)

但是,我仍然遇到类似function的问题:

我变了:

tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp]; 

 free(tmp) --> delete [] tmp; 

但是,在以下函数中如何处理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; jreal == ASSET_REAL) { ntmp++; if (ntmp > mtmp) { /* need more space */ mtmp += CHUNK_SIZE; tmp = realloc(tmp, sizeof(char*) * mtmp); name; 

我收到以下错误:

 error: invalid conversion from 'void*' to 'char**'| 

编辑2:

好的,我得到的共识是我应该抛弃我目前的解决方案(我愿意这样做)。

为了确保我理解正确,你们是否意味着,我应该只有一个包含对象本身的向量而不是指向对象的数组?

C允许void*隐式转换为任何指针。 C ++没有,所以如果你使用realloc ,你必须将结果转换为适当的类型。

但更重要的是,对new[]返回的指针使用realloc是未定义的行为。 并且没有直接的C ++风格等同于realloc

您的选择至少是大多数惯用语:

  • 坚持malloc / realloc / free并投射指针。
  • 使用new[] + delete[]而不是realloc
  • 使用std::vector而不是管理自己的内存。

这似乎是一个不起眼的arrays,可以根据需要增长。

停止使用显式内存分配,你几乎肯定不需要它。 使用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; } 

在C ++中

 std::vector tmp(size); // No need for free (destructor does that). tmp.resize(newSize); 

http://www.cplusplus.com/forum/general/18311/

(简而言之 – 没有真正的C ++等同于realloc ,但也许你更realloc使用vector ?)

Realloc并不关心调用构造函数,因此在new之后使用realloc似乎是一个坏主意。你应该将vector作为一种更好的方法。 您可以调整矢量大小。

不幸的是,C ++中没有realloc (由于内存可能包含非平凡构造或只是非可复制对象)。 分配新缓冲区并复制或学习使用std::vectorstd::stack来自动执行此操作。

我会考虑从手工制作的动态arrays切换到矢量作为首选。

至于矢量是否应该直接包含对象,或者包含指向实际对象的指针,没有一个明确的答案 – 它取决于许多因素。

最重要的因素是这些是否是我称之为“实体”的对象 – 复制毫无意义的对象。 一个典型的例子就是iostream或网络连接。 通常没有逻辑方法来复制或分配这样的对象。 如果那是你正在处理的那种对象,你几乎不会存储指针。

但是,如果您正在处理通常(松散地)定义为“值对象”的内容,则复制和分配将没有问题,并且将对象直接存储在向量中将是正常的。 对于这样的对象,存储指针的主要原因是,当向量必须扩展内存以为更多对象腾出空间时,向量可以/将复制对象。 如果您的对象如此庞大且复制昂贵,这是不可接受的,那么您可能希望在向量中存储类似指针的内容以获得廉价的复制和分配。 有可能它不会是一个原始指针 – 它可能是某种智能指针对象,它提供更多类似于语义的语义,因此大多数其他代码可以将对象视为一个简单的值,并且其昂贵的细节操作等可以保持隐藏状态。

没有C ++等效的realloc()。

最佳用途:

 char* new_tmp = new (char*)[mtmp]; for (int n=0;n 

您得到的错误是因为C ++对隐式类型转换不太宽松。