草庐IT

link-delete

全部标签

c++ - 为什么operator delete的签名要带两个参数?

我一直在阅读有关重载new和delete(以及放置new/delete等相关主题)的内容。到目前为止让我感到困惑的一件事是operatordelete的标准签名是(在类范围内):voidoperatordelete(void*rawMemory,std::size_tsize)throw();删除是这样调用的:MyClass*ptr=newMyClass;deleteptr;那么,deleteptr;是如何提供size的第二个参数的呢?另外,我可以假设MyClass*在这种情况下被隐式转换为void*吗? 最佳答案 简答:new和d

c++ - STL Vector是否默认使用 'new'和 'delete'进行内存分配?

我正在为应用程序开发一个插件,其中的内存应该由应用程序分配并跟踪它。因此,应该以缓冲区的形式从主机应用程序获取内存句柄,然后将它们返回给应用程序。现在,我正计划使用STLVectors,我想知道它在内部使用了什么样的内存分配。它是否在内部使用"new"和“删除”功能?如果是这样,我可以用自己的函数重载"new"和“删除”吗?或者我应该创建自己的模板分配器,这对我来说似乎是一项艰巨的工作,因为我在创建自定义模板方面没有那么丰富的经验。欢迎任何建议/示例代码。可以像这样从应用程序中获取内存句柄void*bufferH=NULL;bufferH=MemReg()->New_Mem_Handl

c++ - `delete this;` 语句期间发生了什么?

请考虑以下代码:classfoo{public:foo(){}~foo(){}voiddone(){deletethis;}private:intx;};在以下两个选项中发生了什么(它是否有效?):选项1:voidmain(){foo*a=newfoo();a->done();deletea;}选项2:voidmain(){fooa;a.done();}选项1的第二个deletea;语句会导致异常或堆损坏吗?选项2会导致异常或堆损坏吗? 最佳答案 deletethis;是允许的,它会删除对象。您的两个代码片段都有未定义的行为-在第一

c++ - 为什么 new()/delete() 比 malloc()/free() 慢?

为什么new()/delete()比malloc()/free()慢?编辑:感谢到目前为止的回答。请指出标准C++实现new()和delete()的规范,谢谢! 最佳答案 看这段C代码:structdata*pd=malloc(sizeof(structdata));init_data(pd);C++中的new操作符本质上是在做上面这段代码所做的事情。这就是它比malloc()慢的原因。delete也是如此。它的作用与此相同:deinit_data(pd);free(pd);如果构造函数和析构函数为空(如内置函数),new和dele

c++ - 为什么 C++ 运算符 new/delete/variants 不应该在头文件中?

有人能解释一下这个C++编译错误的性质吗?我正在涉足/学习重载全局运算符new、delete及其变体。我读了coupleofarticlesonthesubject,但我找不到一个似乎专门解决这个问题的。守则foo.h:#ifndeffoo_h#definefoo_hvoid*operatornew(size_t);void*operatornew[](size_t);voidoperatordelete(void*);voidoperatordelete[](void*);#endif//foo_hfoo.cpp:#include#includevoid*operatornew(si

c++ -/usr/bin/ld : warning: abc. 所以,找不到 xyz.so 所需(尝试使用 -rpath 或 -rpath-link)”

我正在构建一个C++应用程序,使用Netbeans6.9作为我的IDE。我有一个C++库,它是一个纯C库的包装器。我已将文件正确添加到项目中(使用添加库文件选项)。这是g++和链接器产生的输出:g++-odist/Debug/GNU-Linux-x86/testluaembedbuild/Debug/GNU-Linux-x86/src/main.obuild/Debug/GNU-Linux-x86/src/LuaBinding.o-L../../mainline/tanlib_core/dist/Debug/GNU-Linux-x86-L../../mainline/tanlib++/

c++ - 错误 : implicitly deleted because the default definition would be ill-formed (vector of structs)

我无法编译我的C++程序。非常感谢有关此错误的一些帮助。在头文件中,我有这个:structworkerT{workerT():status(true),threadSem(0){}boolstatus;std::functionfunc;semaphorethreadSem;};std::vectorworkers;在我的.cc文件中,我尝试像这样初始化该vector:fill(workers.begin(),workers.end(),workerT());这失败并出现以下错误:错误:'TP::workerT&TP::workerT::operator=(constTP::worke

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++ - 内联失败 : function body can be overwritten at link time

我今天从我认为具有g++-4.6的Ubuntu12.04升级到具有g++-4.7.2的Ubuntu12.10。在我的代码中,我有几个函数标记为__attribute__((always_inline))。原因很简单,分析向我展示了它显着提高了代码的性能。它在g++4.6上运行良好,但现在在g++4.7上我收到错误消息:error:inliningfailedincalltoalways_inline'voidfunc_name(args)':functionbodycanbeoverwrittenatlinktime我无法分享我的实际代码,我试图缩小范围,但是当我更改太多时,错误就会消

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

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