草庐IT

soft-delete

全部标签

c++ - 在从放置 new 获得的指针上使用 operator delete 的合法性

我很确定这段代码应该是非法的,因为它显然不起作用,但它似乎是C++0xFCD允许的。classX{/*...*/};void*raw=malloc(sizeof(X));X*p=new(raw)X();//accordingtothestandard,theRHSisaplacement-newexpression::operatordelete(p);//definitelywrong,perlitb'sanswerdeletep;//legal?Ihopenot也许你们中的一位语言律师可以解释标准是如何禁止这样做的。还有数组形式:classX{/*...*/};void*raw=m

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 仅从基类调用析构函数?

这个问题在这里已经有了答案:shared_ptrmagic:)(3个回答)关闭8年前。为什么当使用std::shared_ptr释放时,当第二个示例仅从基类调用析构函数时,会同时从基类和派生类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestructor--------------------Basedestructor我期望在这两种情况下都有相同的行为。 最佳答案

c++ - 析构函数 C++ : type '***' argument given to 'delete' , 预期指针

我声明了一个私有(private)变量vectortheVector;在我的SomeClass类中的某个地方。为什么我不能在SomeClass析构函数中说:deletetheVector?编译器错误提示:type`classVector'argumentgivento`delete',expectedpointer预期的指针是什么? 最佳答案 如果new和delete齐头并进。要删除一些东西,你需要通过new来创建它(它给你一个指针)。然后,您可以删除指针。您在堆栈(而不是堆)上声明vector的方式,当它超出范围时将被释放。int

c++ - 为什么 *must* delete[] 和 delete 是不同的?

我很清楚,在C++中,delete[]是new[],delete是new。这与C++语法无关。我想知道reasonsdelete[]被定义为与普通delete不同的东西。这样做的实现原因是什么?考虑一下这段代码会发生什么:MyClass*object=newMyClass;deleteobject;当遇到delete时,内存管理器必须在其分配结构中查找对象指针值,无论它是什么,并标记相应的sizeof(MyClass)block内存为空闲。现在考虑一下这段代码会发生什么:MyClass*array=newMyClass[num_objects];delete[]array;当遇到del

c++ - 析构函数上的 =delete 如何防止堆栈分配?

在此SOquestion声明此构造可防止实例的堆栈分配。classFS_Only{~FS_Only()=delete;//disallowstackallocation};我的问题是,它如何防止分配?我了解,无论是显式还是隐式,都无法删除此实例。但我认为,这会分别导致内存泄漏或运行时错误。编译器是否足够聪明,可以解决这个问题并引发编译器错误?还有为什么需要这个? 最佳答案 具有自动存储持续时间的变量(即局部变量)的析构函数需要在变量的生命周期结束时运行。如果没有可访问的析构函数,编译器将拒绝编译分配此类变量的代码。基本上,“堆栈分配

c++ - 对 'operator delete(void*)' 的 undefined reference

我是C++编程的新手,但从事C和Java方面的工作已经很长时间了。我正在尝试在我正在处理的一些串行协议(protocol)中做一个类似接口(interface)的层次结构,并不断收到错误:Undefinedreferenceto'operatordelete(void*)'(简化的)代码如下:PacketWriter.h:classPacketWriter{public:virtual~PacketWriter(){}virtualuint8_tnextByte()=0;}StringWriter.h:classStringWriter:publicPacketWriter{publi

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++ - 如果使用 delete 释放使用 malloc() 获得的内存,是否应该产生警告甚至断言失败?

在C++中,使用delete来释放通过malloc()获得的内存并不一定会导致程序崩溃。如果使用delete来释放使用malloc()获得的内存,是否应该产生警告甚至断言失败?为什么Stroustrup在C++上没有这个功能? 最佳答案 InC++usingdeletetofreememoryobtainedwithmalloc()doesn'tnecessarilycauseaprogramtoblowup.不,但它必然会导致未定义的行为,这意味着任何事情都可能发生,包括程序崩溃或程序继续以看似正确的方式运行。Doyouguyst

c++ - 调用析构函数或调用 `delete` 时是否释放内存?

假设你有一个classFool的对象。classFool{inta,b,c;double*array;//...~Fool(){//destroysthearray..delete[]array;}};Fool*fool=newFool();现在,Iknowyoushouldn't,但是有些傻瓜无论如何都会在fool上调用析构函数。傻瓜->~Fool();.这是否意味着fool的内存已被释放,(即a、b、c无效)或是否仅表示~Fool中的任何释放()函数发生(即只删除数组?)所以我想我的问题是,析构函数只是另一个函数,它在对象上调用delete时被调用,还是做更多的事情?

c++ - 对于 C++ 中的指针,delete 命令真正对内存有什么作用?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++delete-ItdeletesmyobjectsbutIcanstillaccessthedata?Canalocalvariable'smemorybeaccessedoutsideitsscope?当我想释放用new分配的内存时,我不明白delete究竟做了什么。在C++Premiere书中写道:Thisremovesthememorytowhichpspointerpoints;itdoesn’tremovethepointerpsitself.Youcanreuseps,forexample,