如何在C++中使用malloc()函数

6

How to use malloc() in C++ program?


1
从你之前的问题和这个问题来看,你似乎对C和C++有些困惑。一般来说,在C++代码中不应该使用C库函数(尽管没有什么阻止你这样做)。 - Paul R
4
@Gustly,SO的整个目的是成为Google为编程问题“引荐”您的地方。这就是为什么LMGTFY永远不是一个有效的回答。如果一个问题是一个重复问题、与编程无关或者过于含糊以至于没有一个真正的答案,那么请尽管投诉,但不要把相关的问题(甚至是简单的问题)推到其他地方去。 - paxdiablo
3
malloc只是一个函数,你需要通过调用它来使用它,就像使用其他函数一样。更重要的是要知道它做什么以及为什么要使用它。你想解决什么问题,认为malloc可以成为答案? - CB Bailey
1
@Steve:这个问题模糊不清且不完整(请注意“不是一个真正的问题”附带的描述)。例如,OP可以通过展示他尝试过什么、询问特定的(示例)代码、要求对他阅读过的文档进行澄清(即引用文档)等方式使其可接受。此外,虽然您总是根据问题的内容来判断,但我在与这位发布者的历史经验中发现,他永远不会解决这些问题,因此我没有问题投票关闭,而不是给他几天时间来解决它。 - Roger Pate
1
@Roger:我对网站定义的“不是一个真正的问题”关闭原因没有任何问题。当你“无法确定正在被问什么”时,它非常好用——模糊的胡言乱语等等。如果投票关闭的五个人不能确定正在被问什么,那么我感到惊讶,因此我怀疑他们在扩大定义。我同意你的观点,即提问者未能改进问题(他已经得到了答案),但我不同意你的立场,“提问者未能改进问题”与该网站对“不是一个真正的问题”的定义有任何关系。 - Steve Jessop
显示剩余11条评论
6个回答

9
在C++中,不应使用malloc,而应改用new。实际上,在大多数基本的C++编程中,你可能也不应该使用new。但是,一个基本的例子是声明一个数组:int * array = new int [n]。这将为n个整数分配空间,并返回指向第一个整数地址的指针。请注意,你必须显式调用delete[]来释放此内存分配。

7

大多数情况下,你不应该使用它。C++提供了newdelete运算符来进行内存管理,甚至可以通过使用智能指针(如Boost库中的boost::shared_ptr)来避免大部分delete操作。

示例:

// malloc
Duck* duck = (Duck*)malloc(sizeof(Duck));

// new
Duck* duck = new Duck();

还要注意,如果Duck类有一个非平凡的构造函数,则new几乎是必需的。(几乎,因为你可以使用带有放置newmalloc,但那会使我们偏离主要话题。)


5

问题 1: "如何从C++中调用malloc函数?"

以下两种方法之一:

#include <cstdlib>

...

int *iptr = (int*) std::malloc(sizeof(*iptr));


#include <stdlib.h>

...

int *iptr = (int*) malloc(sizeof(*iptr));

与C语言一样,如果您喜欢可以使用sizeof(int),而不是sizeof(*iptr)
请注意,如果您使用cstdlib,则需要命名空间(理论上)。正如Neil所说的,几乎所有实现<cstdlib>的编译器将malloc放在全局命名空间中,但标准并不保证这一点。
此外,还需要进行转换,因为C++缺乏C语言中void*到其他指针类型的自动转换。您可以使用static_cast而不是C风格的转换,但在这种情况下,个人认为没有必要。
众所周知,在C++中很少有使用malloc的好理由。与需要分配内存的C代码进行接口操作(因为C代码将释放它)是一个好理由,但即使两个代码片段位于不同的dll中,也可能会遇到问题。
问题2:“如何在C++中分配内存?”
通常,您将执行以下操作:
int *iptr = new int;
int *intarrayptr = new int[23];
delete iptr;
delete[] intarrayptr;

如果需要将原始数据用于某些无法表示为C++对象/数组的不良目的,请执行以下操作:

unsigned char *twentythreebytes = (unsigned char*) ::operator new(23);
::operator delete(twentythreebytes);

然而,在(设计良好,高级)C ++代码中,像这样从堆中分配内存也相当罕见。尽可能使用自动或成员变量以及标准容器:

#include <vector>

...

std::vector<int> intarray(23);
// no need to delete: the array will be destroyed when it goes out of scope.

你知道哪些实现可以在使用 cstdlib 时将malloc从全局命名空间中移除吗? - anon
1
据我所知,它们没有。但无论它们是否这样做,我都不会注意到。有哪些实现会费心记录哪些标准头文件将东西放入全局命名空间中呢?;-) 我提到了这个区别,因为一个新接触C++的人总会在某个时候学习到,通常情况下std是C++头文件定义东西的地方。标准C函数确实不是说明这一点的最好例子。 - Steve Jessop
@Neil:已更新以反映您的观点,希望没问题。 - Steve Jessop
2
Perl将其称为X-Y问题:提问者想要做X,认为Y可能是实现X的方法,并询问“如何Y?”。不太有用的回答通常是“永远不要做Y”,而更有用的回答是“我认为你想做X,让我告诉你如何做X”。 - Hudson

2

newdelete 操作符是 C++ 中替代 malloc()free() 的首选方法,因为它们能够调用类的构造函数和析构函数,并且能够进行内存的分配和释放:

Foo* foo_ptr = new Foo();
delete foo_ptr;  // this calls Foo::~Foo(), the destructor

0
我在C++中使用mallocfree的唯一时候是为了实现内存管理例程的虚拟版本。
#include <cstdlib>
#include <stdexcept>

void* operator new(size_t number_of_bytes) throw (std::bad_alloc)
{
    void* p = malloc(number_of_bytes);
    if (p == 0) throw std::bad_alloc();
    std::cout << "allocated non-array memory @ " << p << '\n';
    return p;
}

void* operator new[](size_t number_of_bytes) throw (std::bad_alloc)
{
    void* p = malloc(number_of_bytes);
    if (p == 0) throw std::bad_alloc();
    std::cout << "allocated     array memory @ " << p << '\n';
    return p;
}

void operator delete(void* p) throw ()
{
    if (p == 0) return;
    std::cout << "releasing non-array memory @ " << p << '\n';
    free(p);
}

void operator delete[](void* p) throw ()
{
    if (p == 0) return;
    std::cout << "releasing     array memory @ " << p << '\n';
    free(p);
}

-1

在C++中应避免使用mallocfree,因为它们处理未初始化的内存,而应该使用newdelete

另一个主要原因是使用new & delete:它们更具可移植性,而malloc/calloc..则不具备(此外,new调用构造函数,delete调用析构函数,而malloc和free则不会)。 通常情况下,您在不同平台上使用new & delete也不会出现问题,因为它们安全地封装了对本机malloc函数的所有调用。

new运算符可用于创建任何类型的对象。它采用以下一般形式-

pointer-variable = new data-type;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接