抛出异常会返回内存异常错误

时间:2017-05-07 11:19:41

标签: c++ memory-leaks sdl-2 sigabrt sdl-ttf

我试图在中渲染文字。该文字应显示在剪辑区SDL_Rect destination的{​​{1}}中,但会返回错误。我尝试使用进行调试,但我仍然没有看到问题。

我会将整个代码留在最后,但这里是文本呈现的部分:

SDL_Rect rcTextOutput

我注意到来自this answerSDL_SetRenderDrawColor(gRenderer, 0x40, 0x40, 0x40, 0x40); gTextSurface = TTF_RenderText_Solid(gFont, "text", gTextColor); if (gTextSurface == NULL) { throw "Unable to render texture! ERROR: "; } gTextTexture = SDL_CreateTextureFromSurface(gRenderer, gTextSurface); if (gTextTexture == NULL) { throw "Unable to render texture! ERROR: "; } SDL_Rect destination; destination.x = rcTextOutput.x + rcTextOutput.w - 800; destination.y = rcTextOutput.y; destination.w = 800; destination.h = 20; SDL_RenderSetClipRect(gRenderer, &rcTextOutput); SDL_RenderCopy(gRenderer, gTextTexture, NULL, &destination); SDL_RenderSetClipRect(gRenderer, NULL); // ... SDL_RenderPresent(gRenderer); 及其示例,但它无效。

我已经查看了这个Lazy Foo' tutorial,代码似乎是有序的。我还在其上运行并返回:

SDL_SetClipRect()

我甚至试过

Starting program: /home/pradana/Projects/sierra/caventure/build/caventure 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[New Thread 0x7fffeb5f1700 (LWP 25319)]
[New Thread 0x7fffeadf0700 (LWP 25320)]
terminate called after throwing an instance of 'char const*'

Thread 1 "caventure" received signal SIGABRT, Aborted.
0x00007ffff6c92a10 in raise () from /usr/lib/libc.so.6

这里是脚本的其余部分(不相关的代码已删除):

==25239== Memcheck, a memory error detector
==25239== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==25239== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==25239== Command: build/./caventure
==25239== 
==25239== Syscall param writev(vector[...]) points to uninitialised byte(s)
==25239==    at 0x5CF218D: ??? (in /usr/lib/libc-2.25.so)
==25239==    by 0x8088BAC: ??? (in /usr/lib/libxcb.so.1.1.0)
==25239==    by 0x8088FAC: ??? (in /usr/lib/libxcb.so.1.1.0)
==25239==    by 0x808902C: xcb_writev (in /usr/lib/libxcb.so.1.1.0)
==25239==    by 0x7D7EF3D: _XSend (in /usr/lib/libX11.so.6.3.0)
==25239==    by 0x7D7F431: _XReply (in /usr/lib/libX11.so.6.3.0)
==25239==    by 0x7D6A2EE: XInternAtom (in /usr/lib/libX11.so.6.3.0)
==25239==    by 0x4EFB79A: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4EFC694: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4EEB87F: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4EEB60E: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4E4F1C6: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==  Address 0x79c5573 is 35 bytes inside a block of size 16,384 alloc'd
==25239==    at 0x4C2CF35: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==25239==    by 0x7D6F385: XOpenDisplay (in /usr/lib/libX11.so.6.3.0)
==25239==    by 0x4EFA84F: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4EEB5BB: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4E4F1C6: ??? (in /usr/lib/libSDL2-2.0.so.0.4.1)
==25239==    by 0x4011F3: init() (in /home/pradana/Projects/sierra/caventure/build/caventure)
==25239==    by 0x40148A: main (in /home/pradana/Projects/sierra/caventure/build/caventure)
==25239== 
terminate called after throwing an instance of 'char const*'
==25239== 
==25239== Process terminating with default action of signal 6 (SIGABRT): dumping core
==25239==    at 0x5C41A10: raise (in /usr/lib/libc-2.25.so)
==25239==    by 0x5C43139: abort (in /usr/lib/libc-2.25.so)
==25239==    by 0x53ED4EC: __gnu_cxx::__verbose_terminate_handler() (vterminate.cc:95)
==25239==    by 0x53EB2A5: __cxxabiv1::__terminate(void (*)()) (eh_terminate.cc:47)
==25239==    by 0x53EB2F0: std::terminate() (eh_terminate.cc:57)
==25239==    by 0x53EB507: __cxa_throw (eh_throw.cc:87)
==25239==    by 0x4013FC: loadMedia() (in /home/pradana/Projects/sierra/caventure/build/caventure)
==25239==    by 0x40148F: main (in /home/pradana/Projects/sierra/caventure/build/caventure)
==25239== 
==25239== HEAP SUMMARY:
==25239==     in use at exit: 13,232,031 bytes in 33,989 blocks
==25239==   total heap usage: 76,191 allocs, 42,202 frees, 50,434,525 bytes allocated
==25239== 
==25239== LEAK SUMMARY:
==25239==    definitely lost: 16 bytes in 1 blocks
==25239==    indirectly lost: 176 bytes in 4 blocks
==25239==      possibly lost: 4,143,500 bytes in 29,652 blocks
==25239==    still reachable: 9,088,339 bytes in 4,332 blocks
==25239==         suppressed: 0 bytes in 0 blocks
==25239== Rerun with --leak-check=full to see details of leaked memory
==25239== 
==25239== For counts of detected and suppressed errors, rerun with: -v
==25239== Use --track-origins=yes to see where uninitialised values come from
==25239== ERROR SUMMARY: 5 errors from 1 contexts (suppressed: 0 from 0)

1 个答案:

答案 0 :(得分:2)

您抛出指向字符数组的指针,但尝试捕获对::std::string的引用。这显然不起作用,你的程序因未捕获的异常而被终止。你应该在抛出时显式构造一个字符串,或者你应该抛出并捕获一个可以包含描述的std::runtime_error实例。

throw(::std::runtime_error("Unable to render texture!"));
...
catch(::std::runtime_error const & exception)
{
    printf("%s", exception.what());