- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我的 SDL2.0 程序有内存泄漏我设法把它归结为这段代码,我不知道我是不是瞎了,但有人能看看他们是否能看到这里的内存泄漏吗?
我感谢所有回复的人。
SDL_Color colour = { 255,255,255 };
SDL_Surface* surfaceMessage = nullptr;
SDL_Texture* Message = nullptr;
for (int i = 0; i < m_vItems.size(); i++)
{
if (surfaceMessage != nullptr)
{
SDL_FreeSurface(surfaceMessage);
}
SDL_Color colour = {255,255,255};
if (i == m_iSelection)
{
colour = { 255,0,0 };
}
surfaceMessage = TTF_RenderText_Solid(m_Font, m_vItems[i].c_str(), colour); // as TTF_RenderText_Solid could only be used on SDL_Surface then you have to create the surface first
Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); //now you can convert it into a texture
//Get split change
float thing = screenHeight - 2 * (screenHeight* 0.3);
thing /= m_vItems.size();
SDL_Rect Message_rect; //create a rect
Message_rect.x = m_iPosX; //controls the rect's x coordinate
Message_rect.y = m_iPosY + (i * thing); // controls the rect's y coordinte
Message_rect.w = 0.18* screenWidth; // controls the width of the rect
Message_rect.h = 0.08 * screenHeight; // controls the height of the rect
SDL_RenderCopy(renderer, Message, NULL, &Message_rect); //you put the renderer's name first, the Message, the crop size(you can ignore this if you don't want to dabble with cropping), and the rect which is the size and coordinate of your texture
}
if (surfaceMessage != nullptr)
{
SDL_FreeSurface(surfaceMessage);
}
最佳答案
纹理需要用 SDL_DestroyTexture
销毁功能,而您没有这样做,这会导致内存泄漏。
顺便说一下,当你不再需要它时手动调用原始指针上的销毁函数很容易出错(你很容易忘记它需要去哪里)并且没有必要,Resource Acquisition Is初始化 (RAII)。
确保正确处理获取的资源实际上是 C++ 中的一项相当普遍的要求,而且它非常适合。您可以使用 RAII 获取对象生命周期来为您管理资源,它让您在类的析构函数中放置销毁/解除分配代码,因此当管理资源的对象超出范围时,它会自动执行。这也使异常安全变得容易,因为即使在发生异常的情况下也会执行析构函数代码。
在你的例子中,你有一个类存储一个指向创建的 SDL 对象的指针,然后为你在析构函数中管理的各种对象调用相关的 SDL 生命周期结束函数,所以纹理管理类可能看起来像:
class Texture{
SDL_Texture* texture_;
public:
// or simply pass the arguments for texture creation in and create it internally
Texture(SDL_Texture* texture) : texture_{texture}{}
~Texture(){
if (texture_ != nullptr){
SDL_DestroyTexture(texture_);
}
}
// ... functions to access texture
};
但是请注意,您实际上是在包装一个指向具有非典型生命周期结束要求的资源的指针,并且这些要求本质上是调用一个将指针作为参数的自由函数,前提是它不是空指针。
你不需要创建一个特定的类来做这件事——unique_ptr
是为这个工作设计的,如果你给它一个自定义删除器,它会做得很好.为 unique_ptr
提供自定义删除器也是一项简单的任务。1
如果你有一个函数,它接受一个指针类型 T*
作为它唯一的参数,并结束指向对象和相关内存的生命周期,它就像这样简单:
#include <memory>
void shoutFooDestruction(Foo* foo); // my special lifetime ending function
int main(){
std::unique_ptr<Foo, decltype(&shoutFooDestruction)> ptr{
new Foo(),
shoutFooDestruction};
ptr.reset(new Foo());
}
这将调用 shoutFooDestruction
两次:一次是针对在其生命周期开始时赋予唯一指针的原始指针,另一次是在 unique_ptr
被重置时调用
,一次用于重置时提供的 Foo,当 unique_pointer 的生命周期在 main
结束时结束。2
SDL_Texture 的等价物是:
std::unique_ptr<SDL_Texture, &SDL_DestroyTexture> message{
nullptr,
SDL_DestroyTexture};
对于 SDL_Surface:
std::unique_ptr<SDL_Surface, &SDL_FreeSurface> surfaceMessage{
nullptr,
SDL_FreeSurface};
当您需要来自 SDL 的新纹理或表面时,您可以在唯一指针上调用 reset
,它们会为您处理任何旧纹理或表面。当 unique_ptr
超出范围时,将使用相同的函数处理函数末尾 unique_ptr
的任何剩余内容。
1。如构造函数 3 和 4 中所示 on cppreference's page on constructors for unique pointers
2。在具有 nullptr
值的唯一指针上调用 reset
will not call the provided deleter unique_ptr
's destructor也是如此,因此如果您没有要删除的内容,则无需担心避免删除调用。
关于c++ - SDL 2.0 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38728023/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!