草庐IT

RESIZE_HANDLE_SIZE

全部标签

c++ - "size_t"作为类型参数,未重现转换警告

我一直在尝试消除一些旧代码中的警告(必须使用MSVC2005,目前使用32位构建),但一直在努力消除size_t至unsignedint转换警告。我们有自己的Array实现一个不断增长的数组的实现templateconstT&at(constIi)const{returnatImpl(i);}方法。当调用为size_ti=10;myArray.at(i);我得到一个conversionfrom'size_t'to'constunsignedint',possiblelossofdata警告。一个工作理论是I理解为unsignedint,这导致编译器强制转换/转换size_t至unsig

c++ - 使用 native_handle() + pthread_cancel() 取消 std::thread

我正在将之前围绕pthreads的线程包装器转换为std::thread。但是c++11没有办法取消线程。尽管如此,我还是需要取消线程,因为它们可能正在外部库中执行非常冗长的任务。我正在考虑在我的平台中使用给我pthread_id的native_handle。我在Linux(Ubuntu12.10)中使用gcc4.7。这个想法是:#include#include#includeusingnamespacestd;intmain(intargc,char**argv){cout线程被pthreads抛出的异常取消。我的问题是:这种做法会不会有什么问题(除了不可移植)?

c++ - 缩短字符串时 std::string::resize 和 std::string::erase 之间的区别

当缩短std::string时,基本上有两种可能性:string.resize(length)或string.erase(length).既然我们知道字符串会变小,那两者有什么区别呢? 最佳答案 resize必须检查length>current或length-它的行为取决于比较的结果。erase总是减少字符串的长度在异常安全方面存在差异:resize:强保证:如果抛出异常,则字符串没有变化。(来自here)erase:C++98-等于resize;C++14-函数没有抛出版本(来自here)

c++ - 在使用 gdb 检查核心转储时,有没有办法运行函数(如 std::string.size())?

考虑一个产生某些段错误并中止的C++程序。在使用gdb进行常规调试时,我可以执行以下操作并查看结果(gdb)r(gdb)pstr_var.size()其中str_var在文件中定义为std::string。但是,我在使用核心转储进行调试时遇到了一些问题。在我通过在gdb中加载核心转储之后gdbEXECUTABLEcore.pid然后在gdb终端运行以下命令(gdb)pstr_var.size()gdb说“如果没有调试过程,你就不能这样做。”我只能做bt(查看堆栈跟踪)或直接打印std::string变量之类的事情,但是找不到一种简单的方法来检查一些信息,例如打印std::string的

c++ - 使用省略号的回退函数 : can we force the size of the parameters pack?

考虑以下代码:#include#includestructS{templateautof(A&&...args)->decltype(std::declval().f(std::forward(args)...),void()){std::coutvoidf(...){std::cout(42);//->hasf(int)s.f(42);//->hasnotf(int)//oopss.f();//->hasnotf(int)}如示例所示,对f的第三次调用工作正常,即使参数数量错误,因为对于回退函数来说它根本没有错.当以这种方式涉及省略号时,有没有办法强制参数的数量?我的意思是,我可以在

c++ - std::span.size() 与数组/vector 大小

我们在工作中使用std::span()(目前使用gsl实现)。最近我们发现将std::span.size()与vector.size()进行比较会产生-Wsign-compare错误:if(span.size()>vector.size())//comparisonbetweensignedandunsignedintegerexpressions[-Wsign-compare]我认为我们不想对这些比较中的每一个进行转换。我们的编码指南将这些警告视为错误。想知道是否有人有任何想法或建议? 最佳答案 您可以使用迭代器并同时使用函数st

c++ - Valgrind 在空析构函数上给出 "Invalid write of size 8"

我有一个声明:std::map*myMap;进入某个类A。这个映射是在A的构造函数中创建的:myMap=newstd::map;MyClass类基本上是一个结构,用于存储一些带有一些getter/setter的数据。MyClass中没有任何指针或新实例,只有一对枚举值、一个无符号整数和一个bool值。所以MyClass析构函数是空的。另一方面,在A的析构函数中我正在删除映射:A::~A(){if(myMap!=NULL){deletemyMap;myMap=NULL;}}这里Valgrind在删除行上告诉我“地址0x4c389b0是一个大小为48的block内的16个字节free'd[

c++ - size_t 和 __w64、time_t 和 __int64 是如何工作的?

我不是C或C++的老手。我不知道time_t是如何定义和设计的。几个帖子,例如:Whatisultimatelyatime_ttypedefto?Whatissize_tinC?Differencebetweensize_tandstd::size_t但是这些帖子只说明什么是time_t或size_t。它没有明确说明time_t或size_t是如何以及在何处定义和声明的。我正在使用WIN8VS2012ExpressC++。我搜索了库,发现size_t是在crtdefs.h中定义的,而不是cstddef。为什么需要size_t、time_t这样的类型?我们可以让sizeof只返回unsi

c++ - 编译器构造 : Handle references to unordered symbols

我有龙书,但它似乎没有处理那个话题......在大多数现代语言中,可以使用某些变量,即使它们在代码中的出现是无序的。示例classFoo{voidbar(){plonk=42;}intplonk;}在函数之后声明变量plonk并不重要。问题有没有什么最佳实践/有用的模式来实现这个?我想到了两种方法:在解析时为看不见的符号添加虚拟符号。当声明被解析时,这些虚拟符号会被它们的真实符号所取代。解析后,我们可以检查是否有剩余的虚拟对象,如果有则输出错误。解析时不要做任何符号的事情,而只创建AST。在通过AST解析步骤后,根据节点添加符号。例如一个类节点添加child的符号并在之后处理它们。例如

c++ - GNU 使 : how to handle sub-projects

ProjFolder\Subfoldersources.cppmakefilemakefileSubfolder应该是一个单独的外部存储库,在checkout项目时拉入。当我将makeall调用到顶级makefile时,将执行以下配方:all:$(NAME).elf$(NAME).s19$(NAME).hex$(NAME).elf:$(OBJECTS)$(LDSCRIPT)Subfolder/lib.amake-CCppAudioPeriphsall@echo"...linking"$(CC)$(OBJECTS)Subfolder/lib.a$(LDFLAGS)$(LIBS)-o$@如