草庐IT

delete-non-virtual-dtor

全部标签

c++ - 我可以在基元上调用 delete 吗?

我有一个模板化类myFoo,它存储类型T的“内容”,它可以是基本类型或指向复杂类型的指针。当myFoo被删除时,我想释放与它恰好存储的所有内容相关的所有内存。这意味着我需要在存储的每个指针上调用delete,但我最终也可能会在原语上调用delete。这样安全吗??我在下面包含了myFoo的草图,以更好地突出显示正在发生的事情。我不确定析构函数的行为是否定义明确。templateclassmyFoo{public:myFoo(intsize){size_=size;T*foo=newT[size_];}voidaddFoo(Ttmp,intindex){foo[index]=tmp;}v

c++ - 将 operator new 和 operator delete 与自定义内存池/分配器一起使用

我正在研究一个内存池/内存分配器实现,我正在一个庄园中设置它,只有一个特殊的“客户端”对象类型可以从池中提取。客户端可以直接构建到池中,或者它可以使用池进行动态内存调用,或者理论上它可以同时进行。我希望能够以调用我的池“alloc()”和“free()”函数的方式重载operatornew和operatordelete,以便获取构建对象所需的内存。我遇到的主要问题之一是让我的运算符(operator)删除以便能够通过调用我编写的pool->free()函数来释放内存。我想出了一个hack,通过将池传递到构造函数并让析构函数执行释放工作来修复它。这一切都很好而且花花公子,直到有人需要从这

c++ - 铿锵错误 : non-const lvalue reference cannot bind to incompatible temporary

我有一段代码可以在MSVC上正常工作,但无法用clang++编译voidMyCass::someMethod(){std::wstringkey(...);auto&refInstance=m_map.find(key);//errorhere}其中m_map定义为std::map>m_map;和clang提示non-constlvaluereferencecannotbindtoincompatibletemporary我有点了解正在创建一个临时文件,但不确定如何解决这个问题。有什么想法吗? 最佳答案 右值不能绑定(bind)到非

c++ - 将 raw operator new、placement new 和 standard delete 结合起来是否合法?

伙计们!出于好奇——以下代码可能不合法,对吗?T*p=::operatornew(sizeof(T));//allocatememoryforaTnew(p)T;//constructaTintotheallocatedmemorydeletep;//deletetheobjectusingthestandarddeleteoperator 最佳答案 没有。您只能删除从新返回的内容-没有异常(exception)。 关于c++-将rawoperatornew、placementnew和s

c++ - 防止继承 operator new 和 delete

(我确实扫描了,但找不到任何类似的东西,如果有欺骗请关闭)。有没有办法防止这两个运算符被继承?例如:structfoo{staticvoid*operatornew(std::size_t){//special}staticvoidoperatordelete(void*p,std::size_t){//special}};structbar:publicfoo{};现在bar将继承这两个运算符-在这种微不足道的情况下,没什么大不了的,如果foo和bar中有数据成员,就会出现问题(在我的情况下更糟,因为foo的分配需要与bar不同!)现在避免这种情况的方法是在bar,我也会实现操作符。

C++1y/C++14 : Converting static constexpr array to non-type template parameter pack?

假设我有一个静态存储持续时间的constexpr数组(已知范围):constexprTinput[]=/*...*/;我有一个需要打包的输出类模板:templatestructoutput_template;我想像这样实例化output_template:usingoutput=output_template;一种方法是:templatestructmake_output_template{templatestaticconstexproutput_templatef(std::index_sequence){return{};};usingtype=decltype(f(std::m

c++ - 重载运算符 delete 可以有默认参数吗?

我正在尝试重载运算符new和delete,并注意到MSVC和GCC在operatordelete的实现上似乎有所不同。考虑以下代码:#includestructCL{//Thebooldoesnothing,otherthanmakingtheseplacementoverloads.void*operatornew(size_ts,boolb=true);voidoperatordelete(void*o,boolb=true);};//Functionsaresimplewrappersforthenormaloperators.void*CL::operatornew(size_

C++ : union of two types without virtual base class inheritance

是否可以在不手动创建交集类型的情况下创建两种类型的并集?问题是在我的上下文中交集类是完全没有意义的,所以创建它会使代码用户感到困惑。我的实际案例:我正在描述一个数字硬件模拟器,它是许多模块的分层树状结构:classport;classmodule0{porta,b,c;}classmodule1{portc,d,e;}我需要创建这两种类型的union:classtop_level_module{porta,b,c,d,e;}我想应该有一些技术来创建union类型(这是我要问的问题):classtop_level_module:union_type{//porta,b,c,d,e;}但是

java - C++ 和 Java : Use of virtual base class

在比较C++和Java的多重继承时,我有些疑惑。即使Java通过接口(interface)使用多重、多级继承-但为什么它不像C++那样使用虚拟基类?是不是因为java接口(interface)的成员被确保在内存中有一个拷贝(它们是publicstaticfinal),并且方法只被声明而没有被定义?C++虚类除了节省内存还有其他用途吗?如果我忘记在我的多重继承程序中使用此功能,是否有任何注意事项?这有点哲理-但为什么C++开发人员不默认将每个基类设为虚拟?提供灵active的必要性是什么?示例将不胜感激。谢谢!! 最佳答案 1)Jav

c++ - 在 C++ 中手动模拟 delete 运算符的效果是否正式非法?

我意识到这是不明智的,我不打算这样做,但我很好奇以下行为是否实际上在形式上是非法的:#includestructX{~X(){std::cout~X();::operatordelete(x);return0;}我的理解是deletex;相当于调用析构函数然后调用::operatordelete(x);,但是我这样做合法吗那手动按标准?我知道这对使用placementnew是有效的,但是在非placement情况下呢?我的预感是它可能是非法的,因为必须为每个new执行delete(而不是operatordelete),但我会有兴趣确定。 最佳答案