草庐IT

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

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

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

c++ - 我应该用 GSL 跨度替换 (void*, size) 吗?

假设我有intfoo(void*p,size_tsize_in_bytes);并假设制作foo没有意义键入。我想成为一名优秀的编码员并应用C++核心准则。具体来说,我想使用跨度而不是(*,len)对。嗯,span不会编译(不能添加到void*);和span或span等将暗示foo实际上需要字符,但它可能不需要。所以我应该使用span在这种情况下,或坚持使用void*? 最佳答案 这个问题没有统一的答案。对于一个函数来说,它需要一个span意味着它采用连续的值数组,没有任何形式的所有权转移。如果该描述不能合理地代表正在发生的事情,那么

c++ - 在我自己的命名空间中定义 size_t 会产生歧义或其他错误吗?

我有以下定义size_t的代码相当于std::size_t和::size_t如果我包括.//h.hppnamespaceN{usingsize_t=decltype(sizeof(int));}//a.hpp#includenamespaceN{classC{size_tsize()const;};voidf(size_t);}//^^^TheseuseN::size_t!这是否以任何方式违反了C++标准,这是否会导致使用这些header和定义std::size_t的任何其他标准header的任何代码出现错误?和::size_t?如果有人不能使用std::size_t,我也会认为这是一

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++ - 使用模板 <int size> 比动态分配有什么好处?

我正在阅读pbrt,它定义了一个类型:templateclassCoefficientSpectrum;classRGBSpectrum:publicCoefficientSpectrum{usingCoefficientSpectrum::c;typedefRGBSpectrumSpectrum;//typedefSampledSpectrumSpectrum;作者说:"WehavenotwrittenthesystemsuchthattheselectionofwhichSpectrumimplementationtousecouldberesolvedatruntime;tosw

c++ - 如何限制参数类型只允许 std::initializer_list<size_t> 或 std::array<size_t, N>?

我希望只有一个模板函数。所以我想到了……template>||std::is_same_v>>>std::ostream&operator(os,""));returnos;}似乎是因为N在std::array,特化失败。有什么方法可以不为这个用例编写2个函数吗? 最佳答案 如果您不想重载的唯一原因是避免重复函数体,您可以转而编写自己的特征。一种这样的方式:namespacedetails{templatestructwritable:std::false_type{};templatestructwritable>:std::tr