草庐IT

信道分配

全部标签

c++ - 为什么在使用复制分配运算符时需要删除资源?

例如我的一本书中的代码:classHasPtr{public:HasPtr(constHasPtr&h):ps(newstd::string(*h.ps)),i(h.i){}HasPtr(conststd::string&s=std::string()):ps(newstd::string(s)),i(0){}HasPtr&operator=(constHasPtr&);~HasPtr(){deleteps;}private:std::string*ps;inti;};HasPtr&HasPtr::operator=(constHasPtr&rhs){autonewp=newstrin

c++ - 为什么 C++ 自定义分配器需要比较运算符?

在实现自定义C++分配器时,需要定义:operator==用于不同value_type的分配器operator!=用于不同value_type的分配器您可以在documentationofAllocatorconcept中查看自定义分配器的示例实现:#include#includetemplatestructMallocator{typedefTvalue_type;Mallocator()=default;templateconstexprMallocator(constMallocator&)noexcept{}T*allocate(std::size_tn){if(n>std::

c++ - 零大小数组分配是什么/意味着什么?

查看一些示例代码并遇到一些零大小数组分配。我创建了以下代码片段来澄清我的问题这是有效的代码:classT{};intmain(void){T*ptr=newT[0];return0;}它有什么用?ptr有效吗?这个构造是可移植的吗? 最佳答案 C++标准中的5.3.4:6direct-new-declarator中的每个constant-expression都应是整型常量表达式(5.19)并求值为严格的正值。direct-new-declarator中的expression应具有非负值的整数或枚举类型(3.9.1)...7当dire

c++ - new() 是否也为类的函数分配内存?

classAnimal{public:inta;doubled;intf(){return25;}};假设上面的代码,我尝试通过说newAnimal()来初始化一个对象,这个new()是否也为函数分配内存f()?换句话说,如果我改用这个类并执行newAnimal(),在内存分配方面有什么不同?:classAnimal{public:inta;doubled;}; 最佳答案 对于没有虚函数的类,函数本身不占用数据空间。函数是可以执行以操作数据的代码段。必须分配的是数据成员。当你有一个虚类时,通常会有一个额外的虚表指针。请注意,vtab

c++ - 如果我不遵守无状态自定义分配器教条,会发生最糟糕的情况吗?

我需要为std::对象创建自定义分配器(特别是最初是为std::vector),但它最终可能会使用其他分配器我需要创建自定义分配器的原因是我需要跟踪应用程序各个组件分配的(堆和堆栈)资源(这是应用程序的固有特性)。我将需要自定义分配器来监视资源的堆部分,因此我必须能够向std::vector构造函数传递类似于trackerIdidToTrackUsage;myAllocaallocator(idToTrackUsage);vectorFoo(allocator);然而,在阅读了一些之后我发现了这个关于STL/C++标准的小炸弹(见引用资料)说给定类型的所有分配器实例应该是等价的(也就是

c++ - 快速成功退出 C++,并分配大量对象

我正在寻找一种方法来快速退出已使用C++类在内存中分配大量结构的C++。程序正确完成,但在程序最后的“返回”之后,所有的自动析构函数都会启动。问题是程序通过大量C++类结构分配了大约15GB的内存,这个自动销毁过程需要当它遍历所有结构时,它本身还需要大约1小时才能完成——尽管我不关心结果。到此为止,程序只用了1小时就完成了任务。我只想返回操作系统并让它执行正常的批发流程分配删除-这非常快。我一直在清理阶段通过手动终止进程来做到这一点-但我正在寻找更好的程序解决方案。我想将成功返回给操作系统,但不想保留任何内存内容。该程序在正常处理过程中确实执行了大量的动态分配/释放,因此不仅仅是简单的

C++:调整动态分配数组大小的正确方法是什么?

在C中,我会使用realloc来完成它。在C++中,通常会考虑使用STLvector类。但如何在不使用上述任何解决方案的情况下正确调整C++中的数组大小? 最佳答案 realloc没有很好的等价物在C++中。您需要手动复制数组并将旧元素复制过来。幸运的是,感谢std::copy在中发挥作用,这还不错:size_tk=/*...*/T*buffer=/*..getoldbufferofsizek...*/T*newBuffer=newT[newSize];//AssumenewSize>=kstd::copy(buffer,buffe

C++ QT 内存分配

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:MemorymanagementinQt?我一直在学习Qt,并且讨论是否应该删除指向Q对象(例如QLabel)的指针。Qt是否对指向Qt对象的指针进行自动内存管理,还是必须手动删除它们?例)#include#includeintmain(intargc,char*argv[]){QApplicationapp(argc,argv);QLabel*label=newQLabel("ImTough.");label->show();intresult=app.exec();//wouldthisbenecessar

c++ - C++ 标准是否允许合并分配的实现?

我在看JonathanBlow的视频Ideasaboutanewprogramminglanguageforgames他在其中讨论了游戏编程中的一种常见模式,他称之为“union分配”。这个想法是当你有一个类有几个动态分配数组的成员时(可以是std::vector但因为它们是固定大小,更像是提议的std::dynarray)您预先分配了足够的内存来存储所有数组数据,并且只为所有数组执行一次足够大的分配,而不是为每个数组执行一次分配。他提出了对这种模式的直接语言支持,这让我想知道C++标准是否允许实现以这种方式合并分配?令我印象深刻的是,这需要编译器做出一些英勇的努力才能实际实现为优化,

c++ - 内存分配栈

在栈中,内存是为main保留的,我们称之为main函数的栈帧。当我们调用Add函数时,内存被保留在栈顶。Add函数栈帧中,a和b为局部指针,c为整数,计算和然后我们返回引用。c是Add函数的局部变量。现在当Add函数执行完成时,堆栈中的内存空间也被释放,所以当我们尝试使用指针访问main中的这个地址时p,我们试图访问的基本上是一个释放的空间。编译器给出了警告,但为什么它仍然正确打印值5?答案可能是机器没有释放内存空间,因为它认为没有必要,因为没有更多的功能。但是,如果我们编写另一个函数Hello那么它肯定会在调用堆栈中为Add函数释放空间,但程序仍会打印Yay5是不是因为像在堆中一样,