草庐IT

new_size

全部标签

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++ - 保证 std::container::size_type 是一个 std::size_t

正在关注thisquestion,我决定使用std::size_t作为size_type对于每个容器,出于明显的可读性原因。我知道这在理论上是可能的std::container::size_type不是std::size_t,但我认为我当前和future的配置并非如此。但是,为了避免恶意错误,我在使用它们时会检查类型是否相同。例如:BOOST_STATIC_ASSERT(boost::is_same::size_type,std::size_t>::value);std::vectorx;/*fillx*/for(std::size_ti=0;i代码的另一个地方,我使用了一个std::

c++ - 如何修复 "Invalid read of size 8 - 40 bytes inside a block of size 64 free' d"

m_PhyToBtMap中SPacket中的shared_ptr似乎导致“大小为8的无效读取-大小为64的block内的40字节已释放”。注意:在valgrind(下面的日志)发出此错误消息之前,它运行了将近22小时,包含数百万条消息,但我也在E​​raseAcknowledgedPackets(下面)中遇到SIGSEGV崩溃,并怀疑这是原因。我正在使用Boost1.63,因为交叉编译器不支持shared_ptr。SendMessageToBt(大小为8的无效读取)和EraseAcknowledgedPackets(大小为64的block内的40个字节已释放)在valgrind日志中被

c++ - 与size_t比较,返回int?

我正在编写“如何像计算机科学家一样用C++思考”中的一些代码示例,而这个示例是关于处理扑克牌类型的对象和牌组的。我正面临这种情况:intCard::find(conststd::vector&deck)const{size_tdeckSize=deck.size();for(size_ti=0;i我不能像文中那样在VisualStudio2010中的C++中的vector上使用“.length()”,而是不得不使用.size(),它返回(我相信)std::size_type。我想我可以使用size_t并摆脱它以避免在不同体系结构上出现问题,正如我一直在阅读的那样,但我想知道我是否返回i

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++ - 在 MacOSX 上,使用 g++,std::vector .size() 线程安全吗?

我有一个在两个线程中共享的std::vector。他们都调用了vec->size();这可能是竞争条件的来源吗?我希望不会,因为vec->size()是常量。谢谢! 最佳答案 如果你正在调用ONLYvec->size()你是安全的。但这在某种程度上令人难以置信。一旦您调用任何更改方法(例如push_back),竞争就会导致获得错误的大小。 关于c++-在MacOSX上,使用g++,std::vector.size()线程安全吗?,我们在StackOverflow上找到一个类似的问题:

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++ 异常 :Throwing Arrays and getting array size in catch

普通函数(例如printArray)采用数组及其大小(2个参数)来打印数组元素。如何使用异常来做同样的事情?更确切地说,如何将数组大小传递给catch处理程序?(假设我没有在try-catch之外声明的constintSIZE)例如。//voidprintArray(int*foo,intsize);intfoo[]={16,2,77,40,12071};//printArray(foo,5);//OK,functioncallusingarrayacceptssize=5try{//dosomethingthrowfoo;}catch(int*pa){//Ihavetogetarra

C++ 套接字 : size of the structure addrinfo

我正在将eclipse与cygwin结合使用。该应用程序是64位的。在cygwin中,结构定义为:structaddrinfo{intai_flags;/*inputflags*/intai_family;/*addressfamilyofsocket*/intai_socktype;/*sockettype*/intai_protocol;/*ai_protocol*/socklen_tai_addrlen;/*lengthofsocketaddress*/char*ai_canonname;/*canonicalnameofservicelocation*/structsockad