草庐IT

new_list

全部标签

c++ - 在 C++ 中重载 new、delete

我遇到这一行是stroustrup运算符函数必须是成员或至少采用一个用户定义类型的参数(重新定义new和delete运算符的函数不需要)。operatornew和operatordelete不是将用户定义的类型作为它们的参数之一吗?这是什么意思,我在这里遗漏了什么吗 最佳答案 Stroustrup的引述显然适用于运算符重载。C++语言仅支持用户定义类型的运算符重载。这意味着重载函数(operator)必须是用户定义类型的成员,或者是具有至少一个用户定义类型参数的独立函数。这正是相关引述的意思。但独立(非成员(member))oper

c++ - C/C++ va_list 没有正确返回参数

我在使用va_list时遇到问题。以下代码适用于int:main(){intf1=1;float**m=function(n,f1);}float**function(intn,...){va_listmem_list;va_start(mem_list,n);for(inti=0;i但是,当我更改为float时,即floatf1=1.0;floatf=va_arg(mem_list,float);printf("%f\n",f);它没有返回正确的值(值为0.00000)。我对正在发生的事情感到非常困惑。 最佳答案 在可变参数调用的

c++ - 将 _msize 与 new[] 一起使用安全吗?

将Microsoft特定的_msize()函数与新的[]一起使用是否安全?例子:int*i=newint[100];size_ts=_msize(i);coutMSDN确实只描述了malloc&Co的用法。我已经使用VisualStudio2010测试了代码,它看起来可以工作!但我想知道是否有一些预期的问题或任何特殊情况? 最佳答案 如果有人为您的类型覆盖operatornew,则可能会出现问题。写起来一样简单constsize_ts=100;int*i=newint[s];或者,如果你真的写C++std::vectori(100)

c++ - 一起使用 "new"和 "if"语句 - 语法相关

对不起大家。我的意思是在我发布的代码中有一个星号。请重新回答。我正在为同事做代码审查,我看到弹出以下语句:if((someClass*object1=newsomeClass)){//Dowork}这个说法和下面的说法一样吗?someClass*object1=newsomeClass;if(object1){//Dowork}我只是想看看它们是否相等,这样我们就不会遇到任何错误。 最佳答案 您不能在第一种形式的if条件内创建对象,除非类型立即出现在括号内,因此:if(someClass*object1=newSomeclass(.

c++ - new 不分配内存

这应该每秒用大约100MB填满我的内存。我使用gnome-systemmonitor和htop跟踪内存使用情况。但不知何故它没有。为什么?#include"unistd.h"#includeintmain(intargc,char*argv[]){while(true){std::cout运行:g++-std=c++11-O0main.cpp;./a.out 最佳答案 因为您没有使用它,所以Linux会进行惰性分配,因此在您使用它之前它不会实际映射任何内存页。如果你输入一些代码:char*test=newchar[100000000

c++ - initializer_list 和参数相关的查找

我正在尝试将std::initializer_list用作使用参数相关查找(ADL)的函数中的参数。但我没有让它工作,我不明白为什么。以下是一个最小的失败示例:#include#includeclassFoo{public:inlinefriendvoidbar(std::initializer_listv){std::coutv){std::cout如上所示,等效的全局函数工作得很好。为什么以上不起作用?我在OSX10.10上使用clang。 最佳答案 我认为问题在于子表达式1{a,a}没有真正的类型,因此它没有关联的类型或命名空

c++ - 有没有办法在编译时检查 std::initializer_list 参数的数量?

我正在尝试创建一个可以接受多个给定类型参数的函数,但是参数的类型和数量都应该通过模板指定。我发现在这种情况下使用C++11的initializer_list可能是一个很好的技术,但是是否可以在编译时检查它的大小?有没有其他技术可以解决这个问题?#include//HereIwanttodefinetypeandnumberofcomponentsforeachpointtemplateclassGeometry{public:voidaddPoint(std::initializer_listcoords){assert(coords.size()==DIM);//Workinggoo

c++ - 获取对 std::list 中最后两个元素的引用

我需要std::list中最后两个元素的别名。最后一个很简单(.back()),但是我应该如何得到它之前的那个呢?我的第一个想法是:在最后一个元素(.end())之后获取一个迭代器,并将它向左移动两次。这是我“制作”的内容:&last_but_one=*----myList.end(),虽然它有效,但我个人觉得它有点模糊,如果我在别人的代码中看到它,我认为我不会轻易解析它1。通读thisanswer显示了一些其他(过于)冗长的方法2:autoiter=n.end();std::advance(iter,-2);&last_but_one=*iter;//thisisoverkill!/

c++ - 使用 new 并能够检查指针是否为 0(空)

有人告诉我这样做,int*i=newint();我将无法检查我的指针是否为0。new发送异常以防失败。但是,如果我出于某种原因不想使用异常怎么办。有什么方法可以检查我的指针是否正确分配? 最佳答案 阅读文档:http://www.cplusplus.com/reference/new/operator%20new/(2)nothrowallocationSameasabove(1),exceptthatonfailureitreturnsanullpointerinsteadofthrowinganexception.以及示例:st

c++ - 我可以在不使用原始指针的情况下避免在 std::initializer_list 初始化期间进行复制吗?

假设我有几个在本地声明的对象,我想使用基于范围的for语法对其进行迭代。这似乎运作良好,但是,似乎要将本地对象放入initializer_list,执行复制。这对于像std::shared_ptr这样的对象来说是个坏消息,据我所知,增加引用计数是一个原子操作。我认为可以避免这种情况的唯一方法是使用原始指针。#include#includeintmain(){std::shared_ptrptrInt1=std::make_shared(1);std::shared_ptrptrInt2=std::make_shared(2);/*inthisloop,ptrInt1andptrInt2