草庐IT

new_customer

全部标签

c++ - 通过new和allocator分配内存有什么区别

通过new/malloc和allocator分配内存有什么区别?如果我们有new和malloc选项,为什么我们还需要一个单独的vector内存分配器? 最佳答案 嗯,我觉得new和malloc是不一样的,allocator提供的功能不一样。malloc返回未初始化的数据,calloc返回零数据。但是如果你正在创建某个类的实例,new将调用构造函数(不是int、bool这些primitive类型,顺便说一句,也可以初始化)。delete会调用析构函数,而free不会。至于allocator,它为用户提供了一个抽象层。allocator

c++ - C++ 标准要求 new char[] 产生对齐内存的意图是什么?

根据C++03标准,5.3.4/10Forarraysofcharandunsignedchar,thedifferencebetweentheresultofthenew-expressionandtheaddressreturnedbytheallocationfunctionshallbeanintegralmultipleofthemoststringentalignmentrequirement(3.9)ofanyobjecttypewhosesizeisnogreaterthanthesizeofthearraybeingcreated.分配函数(operatornew[]

c++ - 覆盖 "new"并记录有关调用者的数据

我正在尝试编写一个内存分析器,到目前为止已经能够让我的自定义函数为malloc、free、new和delete工作。我尝试使用__FILE__和__LINE__将发起者记录在重载的新方法中,但(正如预期的那样)它只给出了重载函数所在位置的详细信息。有没有一种方法可以在不对被测试组件的现有代码进行任何更改的情况下获取有关重载函数的发起者的详细信息(例如#defineformalloc)?我使用的函数是:void*operatornew(size_tsize){if(b_MemProfStarted){b_MemProfStarted=false;o_MemLogFileboolb_Mem

c++ - 链表 : Difference between "node* head=new node" and "node* head"

我正在创建一个由用户输入的大小为n的链接列表。在这里,当我刚刚初始化header时,输出是完美的,但是当我也声明它时,输出附加了两个零。对于size=5如果我写node*head=newnode;输出是432100,如果我只写node*head输出是43210。这是为什么?/*Iamcreatingalinklistofsizenenteredbyuser*File:main.cpp*Author:neha**CreatedonFebruary2,2014,12:39AM*/#include#include#include#includeusingnamespacestd;/***/u

c++ - 为什么 C++ std::map::operator[] 不使用 inplace new?

如果您将C++std::map(和其他容器)与值类型一起使用,您会注意到插入映射会调用元素类型的析构函数。这是因为C++规范要求operator[]的实现等同于:(*((std::map::insert(std::make_pair(x,T()))).first)).second它调用您类型的默认构造函数来构建该对。然后将该临时值复制到map中,然后销毁。对此的确认可以在thisstackoverflowpost中找到和hereoncodeguru.我觉得奇怪的是,这可以在不需要临时变量的情况下实现,并且仍然是等价的。C++有一个特性叫做"inplacenew".std::map和其他

c++ - 使用 CMake 创建 Visual Studio "Custom Build Step"

每次在VisualStudio中构建项目时,我都想运行代码生成器,即使项目中的源文件没有更改。因此,我想按照VisualStudio:RunC++projectPost-BuildEventevenifprojectisup-to-date中的说明设置自定义构建步骤。.如何使用CMake创建这样的构建步骤? 最佳答案 我认为您正在寻找自定义目标:add_custom_target来自文档:Addatargetwithnooutputsoitwillalwaysbebuilt.或者如果你正在生成一个代码文件,https://cmake

c++ - placement new 基于模板 sizeof()

这在C++11中合法吗?使用最新的英特尔编译器编译并且似乎可以工作,但我只是觉得它是侥幸。classcbase{virtualvoidcall();};templateclassfunctor:publiccbase{public:functor(T*obj,void(T::*pfunc)()):_obj(obj),_pfunc(pfunc){}virtualvoidcall(){(_obj)(*_pfunc)();}private:T&_obj;void(T::*_pfunc)();//edited:thisisnogood://conststaticintsize=sizeof(_

c++ - 使用替换的 operator new 进行 Clang 链接时优化会导致 valgrind 中的 free()/delete 不匹配

当将clang3.5.0与-flto一起使用并与共享库链接时,似乎在共享库中调用operatordelete不遵循与调用相同的符号解析顺序来自主要对象的code>operatornew。示例:共享.cpp:voiddeleteIt(int*ptr){deleteptr;}ma​​in.cpp:#include#includevoid*operatornew(size_tsize){void*result=std::malloc(size);if(result==nullptr){throwstd::bad_alloc();}returnresult;}voidoperatordelet

c++ - 如果传递的指针为空,placement new 是否会调用构造函数?

我试图将一个vc7.1项目转换为我从codeproject获得的vs2010。(这是链接http://www.codeproject.com/KB/cpp/transactions.aspx?fid=11253&df=90&mpp=50&noise=3&sort=位置&view=展开&fr=1#xx0xx但是在转换和修改它的配置之后。我发现它调试不成功,它说在DrawIt.exe中的0x0028e7b9处出现未处理的异常:0xC0000005:访问冲突写入位置0x00000000。错误行是这样的data=new(Mm::Allocate(sizeof(DocData),sid))Doc

c++ - int * array = new int [size](); 的有效性

int*array=newint[size]();operator()允许将数组的所有值设置为0(所有位为0)。这称为值初始化。从哪个版本的g++开始有效?其他编译器呢?我在哪里可以找到它的标准? 最佳答案 这是C++标准的一部分;如果它在g++中无效,则g++不合格。从C++标准(ISO/IEC14882:2003)中,有几个部分是相关的:5.3.4/15关于新表达式说:Ifthenew-initializerisoftheform(),theitemisvalue-initialized8.5/5关于初始化程序说:Tovalue