草庐IT

c++ - 将 new[] 与 delete 配对怎么可能只导致内存泄漏?

首先,根据C++标准,对使用new[]分配的任何内容使用delete是未定义的行为。在VisualC++7中,这种配对可能导致两种后果之一。如果new[]'ed类型具有简单的构造函数和析构函数VC++只需使用new而不是new[]并使用delete该block工作正常-new只是调用“分配内存”,delete只是调用“空闲内存”。如果new[]'ed类型具有非平凡的构造函数或析构函数,则上述技巧无法完成-VC++7必须调用正确数量的析构函数。所以它在数组前面加上一个存储元素数量的size_t。现在new[]返回的地址指向第一个元素,而不是block的开头。因此,如果使用delete它只

javascript - 如何在 V8 Javascript 引擎中公开一个 C++ 类,以便可以使用 new 创建它?

officialexamples暴露一个Point类似乎假设在你的程序中会有固定数量的实例。当在Javascript中调用new时,尚不清楚如何在C++代码中分配新实例。如何公开一个可以有多个实例的类?例如,一个Image类:varimg1=newImage(640,480);varimg2=newImage(1024,768);img1.clear("red");img2.clear("black"); 最佳答案 这是最好的blogpostIcouldfindonexposingC++objectstoV8Javascript.它

c++ - 使用 old_pointer + offset 的 new_pointer 设置 shared_ptr

这是一个智能指针:std::shared_ptrp(newchar[size])它表示填充了原始二进制文件内容的数组。在(并且仅在之后)整个数组从文件复制到RAM之后,我可以解析它,并在此期间检索一些标题信息(一些第一个dwords)。然后是实际数据。在不提供更多上下文的情况下,将提到的共享指针设置为实际数据开头的新地址对我来说很方便。此地址仍在分配的内存中。但是如何设置才不会丢失呢?一个问题是(是/否):是否可以设置p在不调用数据删除的情况下偏移前一个指针? 最佳答案 是的,这是可能的。您可以使用构造函数8,此引用中的别名构造函数

c++ - 关于 new 和 delete 的使用,以及 Stroustrup 的建议

关于new和delete的使用,以及Stroustrup的建议……他说了类似的话(但不完全是,这是我在他书中的笔记):Aruleofthumbisthat,newbelongsinconstructorsandsimilaroperations,deletebelongsindestructors.Inaddition,newisoftenusedinargumentstoresourcehandles.Otherwiseavoidusingnewanddelete,useresourcehandles(smartpointers)instead.我想知道C++11经验丰富的人是否真的

c++ - 错误 LNK2005 : new and delete already defined in LIBCMTD. lib(new.obj)

我有一个包含两个项目的VisualStudio2005解决方案。一个是静态库,另一个是用于测试静态库中功能的可执行文件。静态库使用MFC。构建解决方案时出现以下错误。uafxcwd.lib(afxmem.obj):errorLNK2005:"void*__cdecloperatornew(unsignedint)"(??2@YAPAXI@Z)alreadydefinedinLIBCMTD.lib(new.obj)uafxcwd.lib(afxmem.obj):errorLNK2005:"void__cdecloperatordelete(void*)"(??3@YAXPAX@Z)alr

c++ - operator new 重载和对齐

我正在重载operatornew,但我最近遇到了对齐问题。基本上,我有一个类IBase,它在所有必需的变体中提供operatornew和delete。所有类都派生自IBase,因此也使用自定义分配器。我现在面临的问题是我有一个子Foo必须是16字节对齐的,而所有其他的在对齐到8字节时都很好。然而,我的内存分配器默认仅与8字节边界对齐,所以现在IBase::operatornew中的代码返回一block不可用的内存。这应该如何正确解决?我可以简单地将所有分配强制为16字节,这将正常工作,直到弹出32字节对齐类型。弄清楚operatornew内部的对齐方式似乎并不简单(我可以在那里调用虚函

c++ - 为什么 C++ 中的 new 在失败时不返回 NULL

为什么new在失败时不返回NULL?为什么它只在失败时抛出异常?因为它在成功时返回一个指向对象的指针,为什么不在失败时呢?这种行为有什么具体原因吗? 最佳答案 在C++中引入异常之前:失败的new-expression产生了一个空指针。在一个失败的构造函数中,分配了一个空指针到this.引入异常后:一个失败的普通人new-expression抛出异常。在失败的构造函数中抛出异常。一个区别是构造函数的失败报告现在也适用于创建没有动态分配的对象。另一个区别是代码使用new-表达式现在可以更简单,因为错误处理可以从每个这样的代码位置移出并

c++ - "new int(100)"有什么作用?

PossibleDuplicate:isthisavariableorfunction我错误地使用了类似的东西:int*arr=newint(100);它通过了编译,但我知道这是错误的。应该是int*arr=newint[100];我写错了编译器会怎么想? 最佳答案 第一行分配一个int并将其初始化为100。想想int(100)作为构造函数调用。由于这是一个标量分配,尝试访问arr[1]或使用delete[]释放内存将导致未定义的行为。 关于c++-"newint(100)"有什么作用?

c++ - malloc 和放置 new vs. new

过去几天我一直在研究这个问题,到目前为止,除了教条式的论点或诉诸传统(即“这是C++方式!”)之外,我还没有真正找到任何令人信服的东西。如果我正在创建一个对象数组,那么使用的令人信服的原因(除了易用性)是什么:#defineMY_ARRAY_SIZE10//...my_object*my_array=newmy_object[MY_ARRAY_SIZE];for(inti=0;i超过#defineMEMORY_ERROR-1#defineMY_ARRAY_SIZE10//...my_object*my_array=(my_object*)malloc(sizeof(my_object)

c++ - 为什么 new[] 表达式会调用析构函数?

来自C++17标准(草案here),[expr.new]:Ifthenew-expressioncreatesanobjectoranarrayofobjectsofclasstype,accessandambiguitycontrolaredonefortheallocationfunction,thedeallocationfunction,andtheconstructor.Ifthenew-expressioncreatesanarrayofobjectsofclasstype,thedestructorispotentiallyinvoked.new[]为什么会调用析构函数?