Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++; ,你根本不应该使用它。C++提供了用于内存管理的“ >代码>删除>代码>操作,甚至可以通过使用Boost库中的“代码> Boo::SyrdYPPTR < /代码>等智能指针来避免使用删除>代码>。_C++ - Fatal编程技术网

如何在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++替代方案:MalCube()/<代码>和()(代码)>,因为它们知道并能够调用类的构造函数和析构函数,除了内存的分配和释放之外:

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.