草庐IT

c# - new 是否总是在 C++/C#/Java 中的堆上分配

我的理解一直是,无论是C++、C#还是Java,当我们使用new关键字创建对象时,它都会在堆上分配内存。我认为new只有引用类型(类)才需要,而原始类型(int、bool、float等)从不使用new并且总是继续堆栈(除非它们是使用new实例化的类的成员变量)。但是,我一直在阅读information这让我怀疑这个长期存在的假设,至少对于Java和C#。例如,我刚刚注意到在C#中new运算符可用于初始化值类型,请参阅here.这是否是规则的异常(exception),语言的辅助功能,如果是,还会有哪些其他异常(exception)?有人可以澄清一下吗? 最佳

c++ - C++ 构造 "placement new"的用途是什么?

我刚刚了解了名为“placementnew”的C++构造。它允许您精确控制指针在内存中指向的位置。它看起来像这样:#include//Must#includethistouse"placementnew"#include"Fred.h"//DeclarationofclassFredvoidsomeCode(){charmemory[sizeof(Fred)];void*place=memory;Fred*f=new(place)Fred();//CreateapointertoaFred(),//storedat"place"//Thepointersfandplacewillbee

c++ - 在p=new string[0]和p=new int[0]之后,为什么string版本在delete[] p时会崩溃?

我有两段关于new[]和delete[]的代码:1)#includeintmain(){std::string*p=newstd::string[0];delete[]p;return0;}2)在这种情况下,我只是将std::string更改为intintmain(){int*p=newint[0];delete[]p;return0;}我的问题是:为什么第一个程序崩溃并显示以下消息(在linux环境中):Segmentationfault(coredumped)但是第二个程序运行良好,没有任何错误?编辑编译器:g++(Ubuntu/Linaro4.7.2-2ubuntu1)4.7.2

c++ - 有没有办法使用模板特化将 new 与 new [] 分开?

我有一个自动指针类,在构造函数中我传入了一个指针。我希望能够在构造函数中将new与new[]分开,以便我可以在析构函数中正确调用delete或delete[]。这可以通过模板特化来完成吗?我不想在构造函数中传入一个bool值。templateclassMyAutoPtr{public:MyAutoPtr(T*aPtr);};//inuse:MyAutoPtrptr(newint);MyAutoPtrptr2(newint[10]); 最佳答案 很遗憾,没有。两者都返回相同的类型,T*。考虑使用调用适当的重载构造函数的构建器函数:te

C++:push_back(new Object()) 是内存泄漏吗?

以下C++代码是否存在内存泄漏?list.push_back(newString("hi"));据我了解,任何std集合/容器中的push_back总是会制作拷贝。因此,如果复制了新字符串,则没有什么可以删除新字符串,对吧?因为push_back之后没有引用它...我是对还是错?谢谢。Jbu编辑:我想我错了,因为new将返回一个指针......我们将始终拥有能够删除新字符串的指针 最佳答案 是的,但不是你想的那样。取决于如何list已定义并初始化,push_back可能会抛出异常。如果是,则从new返回的指针迷失了,永远无法解脱。但

c++ - "{}"中的 "new int[5]{};"的目的是什么?

如果我们这样写:int*arr=newint[5];在这种情况下,系统会为int类型的5个元素动态分配空间,并返回指向序列第一个元素的指针。但是,一旦我看到下面的代码:int*arr=newint[5]{};那么,new运算符之后的{}是什么意思?这段代码中{}的作用是什么?我已经用我自己的值初始化了数组,像这样:#includeintmain(){int*a=newint[5]{1};for(inti=0;i输出:10000只有第一个元素打印1。为什么? 最佳答案 int*arr=newint[5];执行defaultinitia

c++ - new int[][] 在 C++ 中是有效的吗?

我遇到了一些使用以下方法分配二维数组的代码:autoa=newint[10][10];这是在C++中有效的做法吗?我搜索了几本C++引用书,都没有提到这种方法。通常我会手动完成分配如下:int**a=newint*[10];for(inti=0;i如果第一种方法有效,那么首选哪种方法? 最佳答案 第一个例子:autoa=newint[10][10];将多维数组或数组数组分配为连续的内存块。第二个例子:int**a=newint*[10];for(inti=0;i这不是一个真正的多维数组。实际上,它是一个指针数组,并且需要两次间接访问

c++ - 用放置 new 覆盖内存中的对象

我有一个对象,我想将其“转换”为另一个对象。为此,我在第一个对象上使用了placementnew,它在自己的地址之上创建了另一个类型的新对象。考虑以下代码:#include#includeclassAnimal{public:virtualvoidvoice()=0;virtualvoidtransform(void*animal)=0;virtual~Animal()=default;;};classCat:publicAnimal{public:std::stringname="CAT";voidvoice()override{std::cout您可以看到,当使用transform

c++ - 使用 operator new/malloc 分配的内存块能否在程序执行结束后持续存在?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:WhenyouexitaCapplication,isthemalloc-edmemoryautomaticallyfreed?当我阅读有关在C/C++中的动态内存分配方面分别使用delete/free的强制性时,我想到了这个问题。我想如果内存分配在我的程序执行终止之后仍然存在,那么是的,它是强制性的;否则,我为什么要担心释放分配的空间?操作系统不会在进程终止时自动释放它吗?我有多正确?我的问题是可以int*ip=newint(8);在我的程序终止后仍然存在? 最佳答案

c++ - C++ 中的 new 与 *new

我这样做:MyClassmyObject=*newMyClass();但是很多人说我应该这样做:MyClass*myObject=newMyClass();是否存在性能差异。还是完全使用第二种方法的合乎逻辑的理由?我只是更喜欢使用第一种方法来摆脱指针混淆。 最佳答案 两者都不一样!首先给您一个未定义的行为[Ref1:]或内存泄漏,而如果您稍后调用delete,第二个则不会。MyClassmyObject=*newMyClass();在freestore上分配一个MyClass类型的对象,然后将该对象复制到myObject。您丢失了指