草庐IT

example-new

全部标签

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++ - 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

c++ - 哪个更高效/整洁 : clearing an existing stringstream or creating a new one?

只是出于好奇而提出的简单问题。类上的多个方法需要使用字符串流,或者特别是ostringstream。1)有一个stringstream变量作为类成员,然后在使用它之前清除它,即msg.str("")2)每次需要使用时,在每个方法中本地创建一个新的stringstream变量。就效率和整洁度而言,哪种实现方式最好?我的直觉是选项1,但不确定初始构造与每次调用str()相结合是否会更糟?附言我读过Initializing..whichoneismoreefficient?和Whichisquicker/moreefficient?,我的下一步是研究分析和编写一个小的测试应用程序,但我觉得问

c++ - 表达式 `new T` 的计算结果是右值还是左值?

我目前正在阅读这篇教程/右值引用的解释:http://thbecker.net/articles/rvalue_references/section_07.html在倒数第二段中,作者提到“工厂主体中T的复制构造函数的参数是左值”。他指的代码是这样的:templateshared_ptrfactory(Argconst&arg){returnshared_ptr(newT(arg));}我意识到newT(arg)在堆上构造了一个T对象,但返回值不是一个临时指针值,如果不使用就会丢失(导致内存泄漏)我猜),因此是右值?编辑:澄清一下,我知道这个例子中不会有内存泄漏。我的意思是,如果指针值

c++ - 为什么使用 'new' 是个坏主意?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:InC++,whyshouldnewbeusedaslittleaspossible?在C++中实例化类时使用“new”真的是个坏主意吗?Foundhere.我知道使用原始指针是不明智的,但为什么要使用“new”关键字,因为这是一种糟糕的做法?或者是?