草庐IT

c++ - 从另一个线程中删除对齐的内存

(C++)我在堆上分配了内存对齐的实例,然后在另一个线程中删除它们。代码如下所示:ALIGNEDclassObj{public:ALIGNED_NEW_DELETE...};Thread1:Obj*o=newObj;//overloadednewforalignedmemoryallocationpostTask(o);Thread2:o->runTask();deleteo;//overloadeddeleteforalignedmemorydeletion//"delete"statementcrashes线程2中的删除语句将在VisualStudio2013(_BLOCK_TYP

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++ - 我的神经网络导致堆栈溢出

我很难给出一个最小的例子,因为我认为它与我的更多代码有关。但是,我相信我已经在下面提供了相关代码。我删除了我认为对问题不是很重要的类等部分。我有一个使用神经元的神经网络类:神经元templateclassNeuron{public:Neuron(){for(auto&i:m_inputValues)i=0;for(auto&e:m_eligibilityTraces)e=0;for(auto&w:m_weights)w=0;m_biasWeight=0;m_biasEligibilityTrace=0;m_outputValue=0;}voidSetInputValue(constst

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++ - C4244 : '+=' : conversion from 'std::streamsize' to 'size_t' , 可能丢失数据

我已将我的VC++项目从VS2008迁移到VS2013并收到一些警告,例如:C4244:'+=':conversionfrom'std::streamsize'to'size_t',possiblelossofdata.如何解决这些类型的警告? 最佳答案 在MSVC2013中std::streamsize是:typedef_Longlongstreamsize;typedef_LONGLONG_Longlong;#define_LONGLONG__int64size_t是:typedefunsigned__int64size_t;因

c++ - 大小应该使用有符号整数还是无符号整数?

标准库vector::size()给出size_t,一个无符号数。在一次CppCon演讲中,我听到有人(是ChandlerCarruth吗?)说这很不幸,应该使用有符号整数。背景是没有为有符号整数定义溢出,因此编译器有更多的回旋余地。Carruth在一次谈话中展示了如何uint8_t作为forbzip2中的循环索引在x86上创建的机器指令比int8_t多得多因为它必须使用掩码和移位显式模拟溢出。在我现在处理的代码中,有一些严格为正的大小。这些表示为size_t.这看起来不错,因为这表明它们不能为负。另一方面,不需要定义模运算,因此只要有符号整数足够大(我们达到200),无符号整数就会为

c++ - 具有负值的 size_t 算术

我被要求复制一份std::string在作业中,我在执行substr时遇到问题功能。在老师给我们的一组测试中,有一个测试是length等于-1.矿山申报substr是:Cadenasubstr(size_tstart,size_tlength)const;我(认为)size_t会阻止传递负值。问题是在定义中我检查了size()(假设tam_与size()相同):if(tam_在我的系统中-1在unsigned是18446744073709551615,因此,例如假设开始是9和tam_是10.我希望:10这样抛出异常,但实际上我得到了10这是错误的,不会抛出异常。随着函数的继续,它分配了