草庐IT

c++ - 析构函数无法删除已分配的连续内存块

以下代码可以编译但在运行时会出现错误:#include#includeclassA{public:A(){}A(intid,char*t_name){_id=id;name=newchar[strlen(t_name)+1];strcpy(name,t_name);}char*name;int_id;~A(){delete[]name;}};intmain(){Aa(1,"123");Ab;b=a;std::cout(a.name)(b.name)(a.name)(b.name)它的输出是这样的:0x7ff87bc032000x7ff87bc032000x7ff87bc032000x1

c++ - 保存对象的析构函数地址并在以后调用它是否定义明确的行为?

我目前正在研究用C++编写的堆栈分配器。应该可以通过模板方法从此堆栈分配器获取对象。一旦调用另一个释放方法,这些对象就应该被销毁。在尝试使用不同的方法来实现析构函数的调用时,我偶然发现了以下内容:autodestructor=someObject->~SomeClass;destructor();析构函数似乎是被实际调用的,但这对我来说有点奇怪。我有以下问题:这是明确定义的行为吗?析构函数的类型是什么(我可以用什么替换auto关键字)?我能否将多个不同类型对象的所有析构函数地址保存在一个列表中,并在以后调用它们? 最佳答案 如评论所

c++ - 保留超出范围的类的数据?

我正在使用外部库中的“foo”类,该类计算并存储大量数据。完成计算后,我只想保留结果数据的数组,它大约占“foo”大小的一半。Foo使用函数RawResultsArray()提供指向结果数据的指针。使用类型IDPNSt3__17complexIdEE.到目前为止,我一直在这样做:intN;//lengthoftheresultsarraycomplex*results_to_keep;{foomyFoo;myFoo.findResults();results_to_keep=newcomplex[N];for(autoi=0;i然而,我的工作内存有限,负担不起results_to_ke

c++ - std::atomic::compare_exchange 与两个 memory_order 参数一起使用的真实示例

您能否给出一个真实世界的例子,其中出于某种原因使用了std::atomic::compare_exchange的两个memory_order参数版本(因此一个memory_order参数版本是不够的)? 最佳答案 在许多情况下,compare_exchange上的第二个内存排序参数设置为memory_order_relaxed。在这些情况下,省略它通常并没有错,只是可能效率较低。这里是一个简单的无锁列表/堆栈示例,它需要compare_exchange_weak上的第二个不同的排序参数,以便避免数据竞争。调用push可以并发执行,但

c++ - 对内存中同一地址的写入之间可能存在数据竞争

考虑以下代码段。Tdata;T*ptr1=&data;T*ptr2=&data;*ptr1=...;std::threadthread([ptr2](){*ptr2=...;});thread.join();问题:它是否引入了数据竞争?我的想法:由于ptr1和ptr2是不同的变量,赋值和按值捕获需要重新排序。因此,存在数据竞赛。这是正确的吗? 最佳答案 线程创建意味着先于关系,即给定代码中没有数据竞争。事实上,对*ptr1的赋值实际上发生在下一条语句之前。如果您在线程创建后重新排序代码以将赋值给*ptr1,您将遇到数据竞争:使用哪个

c++ - 为什么 std atomic 将 5 插入堆栈

我想看看std::atomic是如何被翻译成汇编的。为此,我编写了以下代码,但有些地方我不明白。以下代码:intmain(void){std::atomica;a.fetch_add(0);return0;}由GCC编译为:1|pushrbp2|movrbp,rsp3|movDWORDPTR[rbp-4],04|movDWORDPTR[rbp-8],55|movedx,DWORDPTR[rbp-4]6|learax,[rbp-12]7|lockxaddDWORDPTR[rax],edx8|moveax,09|poprbp10|ret为什么GCC将“5”(第4行)压入堆栈?

内存中的 C++ 程序大小

我正在尝试让一个C++程序打印出它自己的内存占用量。打印出C++程序当前使用的内存KB的好方法是什么?我需要它用于Linux和Windows...所以一些独立于平台的东西....谢谢,女士 最佳答案 我不认为有一种多平台的方式来做到这一点。但是您可以使用宏来执行此操作:#ifdef__GCC__//linuxcode#else//windowscode#endif这是windows方法的链接:HowtogetmemoryusageunderWindowsinC++还有一个用于linux方法:Howtogetmemoryusageat

c++ - 处理自定义分配器中没有默认构造函数

我对我的new宏有一个#define,以使用我自己的分配器,例如MYNEW(Type,Allocator)我将在其中分配一些原始内存使用malloc,然后使用placementnew在原始内存上分配类型,例如#defineMYNEW(Type,Allocator)Allocator->Alloc(sizeof(Type));`templateType*Alloc(unsignedintsize)//Allocator::Alloc{return(Type*)new(malloc(reportedSize))Type;}但是,当Type没有默认构造函数时,我遇到了问题。我尝试过的一种情况

c++ - 不仅性能而且内存大小的内存对齐优化

我们知道当你这样定义A时,A的大小是不同的:classA{shorta;doubleb;shortc;};或者像这样classA{shorta;shortc;doubleb;};我假设我们正在为32位操作系统编译并且我们已经告诉编译器对齐到32位。编译器是否真的很难通过重新排序定义来获得最小大小,同时实现相同的性能? 最佳答案 这太难了。结构特别需要按照与结构定义完全相同的顺序对字段进行排序。这个要求可能是对Pascal没有这样的要求并导致令人惊讶的结果的react。无论如何,并非所有CPU架构都需要对齐或填充。在大多数情况下,它会

c++ - 结构包装。有没有自动的方法来做到这一点?

问题:是否有自动进行结构打包的方法?背景:Structurepacking对于降低某些基本数据的内存成本非常有用。基本上,这是通过重新排序内部数据来实现最小内存成本的技巧。我的问题是有没有一种自动方法可以做到这一点?比如我这里有一个structFoo(假设32bit)structFoo{charflag;char*p;shortnumber;};经过自动检查(是否为脚本,是否为native),我应该得到Foo的内存优化版本,即:structFoo{char*p;shortnumber;charflag;};这只是一个玩具示例。考虑下面更困难的情况,手动重新排序将是一项相当大的工作。结构