如何在C++; ,你根本不应该使用它。C++提供了用于内存管理的“ >代码>删除>代码>操作,甚至可以通过使用Boost库中的“代码> Boo::SyrdYPPTR < /代码>等智能指针来避免使用删除>代码>。
例如:如何在C++; ,你根本不应该使用它。C++提供了用于内存管理的“ >代码>删除>代码>操作,甚至可以通过使用Boost库中的“代码> Boo::SyrdYPPTR < /代码>等智能指针来避免使用删除>代码>。,c++,C++,例如: // malloc Duck* duck = (Duck*)malloc(sizeof(Duck)); // new Duck* duck = new Duck(); 还要注意,如果Duck类有一个非平凡的构造函数,那么new几乎是必需的。(几乎可以,因为您可以使用 MalOC 放置位置新< /代码>,但这将使我们偏离主干道。 < P>在C++中不应该使用 MalOC 。您应该改用new。 事实上,您可能也不应该使用new(对于C++中的大多数基本编程)。但是仍然有一个基本的例子是声
// malloc
Duck* duck = (Duck*)malloc(sizeof(Duck));
// new
Duck* duck = new Duck();
还要注意,如果Duck类有一个非平凡的构造函数,那么
new
几乎是必需的。(几乎可以,因为您可以使用<代码> MalOC 放置位置<代码>新< /代码>,但这将使我们偏离主干道。 < P>在C++中不应该使用<代码> MalOC 。您应该改用new
。
事实上,您可能也不应该使用
new
(对于C++中的大多数基本编程)。但是仍然有一个基本的例子是声明一个数组:int*array=newint[n]
。这将为n个整数分配空间,并返回指向第一个整数地址的指针。请注意,必须明确调用<代码>删除> [COD]来释放这个分配。< < > > P> > < <代码> >和>代码>删除>代码>运算符是首选的C++替代方案:Foo* foo_ptr = new Foo();
delete foo_ptr; // this calls Foo::~Foo(), the destructor
<>我在C++中使用过的<>代码> MalcC 和<代码>免费< /代码>是实现内存管理程序的虚版:
#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);
}
#包括
#包括
void*运算符new(大小\u t字节数\u)抛出(std::bad \u alloc)
{
void*p=malloc(字节数);
如果(p==0)抛出std::bad_alloc();
STD::CUT< P>使用<强> MalOC>和Fistaby/Stult>,避免在C++中处理,因为它们处理未初始化的内存和
应改为使用新建和删除
另一个主要原因是使用new&delete:malloc/calloc..不可移植时,它们的可移植性要高得多(另外还有new调用构造函数和delete调用析构函数,而malloc和free则不可移植)。
通常,在具有不同处理器的不同平台上使用new&delete也不会出现问题,因为它们安全地封装了对本机malloc函数的所有调用
新运算符可用于创建任何类型的对象-
<强>指针变量=新数据类型;
>/P>> P>问题1:“我如何调用C++的Maloc?”< /P>
这两项中的一项:
#include <cstdlib>
...
int *iptr = (int*) std::malloc(sizeof(*iptr));
#include <stdlib.h>
...
int *iptr = (int*) malloc(sizeof(*iptr));
或用于原始数据的某些有害用途,不能作为C++对象/数组来表示,请执行以下操作:< /P>
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.
#包括
...
std::向量intarray(23);
//无需删除:数组超出范围时将被销毁。
查看这个问题和你以前的一些问题,你似乎对C和C++有混淆。一般来说,你不应该在C++代码中使用C库函数(虽然没有什么可以阻止你)。@Gustly,SO的全部目的是成为谷歌让你去问编程问题的地方。这就是为什么LMGTFY从来都不是一个有效的回答。一定要抱怨一个问题被愚弄了,或者与编程无关,或者对于一个真正的答案来说太肤浅,但不要发送相关的问题(即使是简单的问题)到另一个地方。malloc
只是一个函数,所以你可以通过调用它来“使用”它,就像其他函数一样。更重要的是要知道它不做什么以及为什么要使用它。你想解决什么问题,你认为malloc
是答案?@Steve:这个问题很模糊,也不完整。(注意“非真实问题”的描述。)OP可以通过以下方式使其被接受:例如,展示他尝试过的内容,询问具体(示例)代码,要求澄清他阅读过的文档(即引用文档)除此之外,虽然你总是根据问题的内容来判断问题,但根据我在这张海报上的经历,他永远不会解决问题的这些问题,所以我现在投票决定结束问题,而不是给他几天时间来解决问题。@Roger:我对“不是真正的问题”没有问题网站定义的封闭式理由。当你“不知道被问什么”时,这是非常好的——含糊不清的闲谈、胡说八道等。如果投票到此封闭式理由的五个人不知道被问什么,我感到惊讶,因此我怀疑他们在扩展定义。我同意你的观点,提问者没有改进问题(首先,他有他的答案),但我不同意你的立场,即“提问者未能改进问题”与本网站对“非真实问题”的定义有任何关系。出于兴趣,您知道在使用cstdlib时从全局名称空间中删除malloc的实现是什么吗?我不知道它们是这样做的。但不管它们是否这样做,我都不会注意到。有哪些实现需要记录哪些标准头将内容放在全局名称空间中?;-)我提到了这个区别,因为有人在C++中需要学习,在某个时候,一般来说,代码> STD < /C>是C++标题定义的地方。当然,从标准C中的函数并不是最好的例子来说明这一点。尼尔:我希望更新来反映你的观点。Perl称之为X-Y问题:提问者W。蚂蚁想做X,认为Y可能是做X的方法,并问“如何做Y?”。没有帮助的答案通常是“永远不要做Y”,而你更有用的回答是“我想你在尝试做X,让我告诉你如何做X”。
#include <vector>
...
std::vector<int> intarray(23);
// no need to delete: the array will be destroyed when it goes out of scope.