C(++)malloc混淆

fai*_*lat 3 c++ arrays malloc

我只是没有进一步为C中的数组分配内存,主要是C++.我找了一些例子,但对我来说没有任何有用的,至少看起来如此.

所以,如果我在这里有一个typedef:

typedef struct
{
int x;
int y;
} Coordinate;

Coordinate* myList;
Run Code Online (Sandbox Code Playgroud)

我也有一个类型的数组Coordinate,如何动态地附加项目.我所知道的是,我必须使用malloc,后来free在C和new/ deleteC++中.(Malloc吓坏了我)

所以我的目标是这样的功能:

void AddSomething ( int x, int y )
{
// myList malloc/new magic here
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如何为myList分配新内存然后将新项添加到其中的行必须如何? 你能告诉我一个C和C++ 的工作示例吗?

  • C中的malloc究竟是如何工作的?有一些我不熟悉的事情(在函数之前有一些指针,并且分配的变量设置为mallocs返回值)

Tot*_*nga 14

使用vector来完成这项工作.

#include <vector>

typedef struct
{
int x;
int y;
} Coordinate;

std::vector<Coordinate> coordinates;

Coordinate newCoord;
newCoord.x = 1;
newCoord.y = 1;

coordinates.push_back(newCoord);
Run Code Online (Sandbox Code Playgroud)

附加信息: 要了解malloc/free和new/delete,您可以阅读章节

13:动态对象创建

在Bruce Eckels Thinking C++第1卷.它是一本可以免费下载的书.


Tim*_*sch 5

对于C,以下将创建包含单个Coordinate的列表:

myList = malloc(sizeof(Coordinate));
Run Code Online (Sandbox Code Playgroud)

如果要分配大小为n的数组,请执行以下操作:

myList = malloc(n * sizeof(Coordinate));
Run Code Online (Sandbox Code Playgroud)

在C++中,大小为n的数组的代码如下所示:

myList = new Coordinate[n];
Run Code Online (Sandbox Code Playgroud)

对于C++情况,您的类必须具有默认构造函数,Coordinate该类具有隐式构造函数.但是对于C++,我强烈建议使用std::vector<Coordinate>而不是手动管理的数组.

另外,您也可以使用malloc()C++分配内存,但它只分配原始内存,而使用new也会触发对构造函数的调用.在你的结构的情况下,没有区别,因为它是一个POD结构,不需要构造函数.另外,请记住,如果使用C++分配内存malloc(),则必须使用free()它来释放它; 如果您正在使用new,则需要使用delete- 将两者混合可能会产生非常有趣的结果,这些结果不是很有趣的调试.有了new,您还必须确保匹配正确的调用类型.任何使用new需要清理的delete东西都需要清除,并且使用上面的例子中使用new new创建的任何内容都需要删除delete[].

  • 别忘了使用`delete []`,而不仅仅是`delete`! (2认同)
  • 一个`void*`被正确地转换为没有强制转换的任何对象指针类型 - 实际上我应该*不*在C中强制转换`malloc`的返回值.我将上面写为`myList = malloc(sizeof*myList) ;` (2认同)