草庐IT

延时分配

全部标签

c++ - Vulkan:延迟分配内存?

我有一种情况,我可能需要在渲染过程中使用模板缓冲区,但是,直到执行渲染过程的中途我才会“知道”。不幸的是,一旦渲染过程已经在进行中(如在D3D12中),Vulkan就无法修改帧缓冲区的附件。但是,我在规范中发现有"lazilyallocatedmemory"的概念。在分配内存时使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT,在表面使用VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT。不幸的是,似乎VkPhysicalDeviceMemoryProperties中的所有VkMemoryType条目(从vkGetPhysic

c++ - C++中的动态内存分配?

为什么会这样?#includeintmain(){std::cout>arraySize;intarray[arraySize];for(intelement:array){element=42;std::cout我对C++中动态内存分配的理解告诉我,需要它的一种情况是当您不知道在编译时需要分配的内存量时。在这个程序中,显然数组大小在程序编译时是未知的,而是动态的,因为它可以随着用户输入的值而改变。这是一个在成功编译后运行的程序(没有警告和错误):g++程序.cpp-std=c++11-o程序.exe输入一个数字:12424242424242424242424242数组大小:48元素数

c++ - 静态变量情况下的内存分配

我总是对静态变量以及它们的内存分配方式感到困惑。例如:inta=1;constintb=2;staticconstintc=3;intfoo(int&arg){arg++;returnarg;}a、b和c的内存是如何分配的?如果我调用foo(a)、foo(b)和foo(c),有什么区别(在内存方面)>? 最佳答案 Iamalwaysconfusedaboutstaticvariables在全局范围内,static仅表示链接时其他文件不可见。Howisthememoryallocatedfora,bandc?所有这些都将存在于可执行文

c++ - 具有函数默认值的参数分配

我有线程生成函数,它接受许多在声明中具有默认值的参数。intspawn(funcptrfunc,voidarg=0,intgrp_id=1,constchar线程名);我想初始化第一个参数func和最后一个参数threadname,其余变量赋默认值。spawn(myfunc,"我的线程");我该怎么做。 最佳答案 你不能。其他语言支持spawn(myfunc,,,"MyThread"),但不支持C++。相反,只需根据自己的喜好重载即可:inlineintspawn(funcptrfunc,constchar*threadname){

c++ - 在数组中查找整数的有效分配(具有给定顺序的排列)

我在寻找一个好的算法来为不同数组中的某些整数生成每个可能的赋值时遇到一个普遍问题。假设我有n个数组和m个数字(我可以有比数字更多的数组,比数组更多的数字或与数字一样多的数组)。例如,我有数字1、2、3和三个数组:{}、{}、{}现在我想找到以下每个解决方案:{1,2,3},{},{}{},{1,2,3},{}{},{},{1,2,3}{1,2},{3},{}{1,2},{},{3}{},{1,2},{3}{1},{2,3},{}{1},{},{2,3}{},{1},{2,3}{1},{2},{3}所以基本上我想找到每个可能的组合,以将数字分配给不同的数组并保持顺序。所以在这个例子中,1

c++ - 如何检测 C++ 中未分配内存的双重删除或删除?

我正在编写全局delete/new运算符的调试版本来检测内存泄漏、双重删除和未分配内存上的删除。就"new"运算符而言,我覆盖了全局新运算符并使用宏传递了文件名和行号信息。覆盖的“new”运算符将内存地址、文件名、大小和行号信息存储在以地址为键的映射中。我也覆盖了“删除”运算符,它从map中删除了已删除地址的条目。现在我想将删除的内存信息存储在另一个映射中,该映射存储调用“删除”的位置的文件名和行号信息。但是删除运算符只接受参数(要删除的对象的内存地址)。有人能告诉我如何检测代码中的双重删除吗? 最佳答案 您已经在重载的new中创建

c++ - delete[] 运算符是否处理通过指针返回的动态分配的内存?

我想知道delete[]运算符如何处理函数返回的指针,而不是在与delete语句相同的范围内进行动态分配。假设我有一个像这样的简单函数:int*getArray(){int*returnVal=newint[3];returnVal[0]=returnVal[1]=returnVal[2]=0;returnreturnVal;}现在,当我需要在代码中使用该数组时,我会执行以下操作:int*vals=getArray();//usevalues...delete[]vals;但是,我想知道,C++编译器如何知道分配的内存块有多大(以及要从vals中删除多少内存元素)?这是一种有效的技术,

c++ - 在堆上分配异常有什么陷阱吗?

问题说明了一切:在堆上分配异常有什么陷阱吗?我问是因为在堆上分配异常,结合polymorphicexceptionidiom,解决线程之间传输异常的问题(为了讨论方便,假设我不能使用exception_ptr)。或者至少我认为它确实...我的一些想法:异常处理程序必须捕获异常并知道如何删除它。这可以通过使用适当的删除器实际抛出auto_ptr来解决。还有其他方法可以跨线程传输异常吗? 最佳答案 Arethereanypitfallswithallocatingexceptionsontheheap?一个明显的陷阱是堆分配可能会失败。

c++ - 如何区分使用内存池分配的类

在一个项目中,我有两种类:类型A:我使用std::unique_ptr管理的正常分配类B类:new被重写以从boostmemorypool分配内存的类对于后者,正确的用法是像往常一样调用new来分配一个新实例,但永远不要调用delete。当内存池对象用完时,这些对象会被清理干净范围。因此,如果我不小心将B类实例存储在std::unique_ptr中,我会得到一个段错误。同样,对B类指针显式调用delete也不是一个好主意。我应该使用什么样的C++机制来防止这些类型的错误发生?作为一个简单但丑陋的修复方法,我正在考虑重命名我所有的B类类,使其具有像MP这样的前缀(用于内存池),所以我直观

c++ - 找到巨大的已分配内存块

我有一个用c/c++编写的程序(守护进程)。它运行完美,但在一段时间后(可能是5天、一周、2周),它会分配大量内存。我不明白代码的哪些部分没有释放分配的内存。启动时内存使用量约为20-30兆字节。然后在一段时间后,或者可能发生事件后,它会以每小时1Mb的速度缓慢增长,如果不终止,可能会因为没有可用内存而崩溃。我已经尝试使用Valgrind并在它已经分配了大约500Mb的内存时以通常的方式关闭了守护进程。关机过程真的很长,但是当它结束时,Valgrind说没有发现内存泄漏,除了mysql_init/mysql_close程序(大约504字节肯定丢失)。Google表示无需担心此Mysql