Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 特定内存地址上的分段错误_C++_Segmentation Fault_Sdl - Fatal编程技术网

C++ 特定内存地址上的分段错误

C++ 特定内存地址上的分段错误,c++,segmentation-fault,sdl,C++,Segmentation Fault,Sdl,在我看来,我有一个最恼人的问题,叫做分割错误。通常,在gdb的帮助下,跟踪我的所有代码,我就能解决这些问题。不幸的是,这次不是。因为我的代码有点复杂,所以我将展示与问题相关的代码片段 首先,此setter函数中给出了错误: void Texture::setRenderer( SDL_Renderer* renderer ) { m_renderer = renderer; } 当然,在我的纹理类中有一个变量定义如下: SDL_Renderer* m_renderer = nullpt

在我看来,我有一个最恼人的问题,叫做分割错误。通常,在gdb的帮助下,跟踪我的所有代码,我就能解决这些问题。不幸的是,这次不是。因为我的代码有点复杂,所以我将展示与问题相关的代码片段

首先,此setter函数中给出了错误:

void Texture::setRenderer( SDL_Renderer* renderer ) {
    m_renderer = renderer;
}
当然,在我的纹理类中有一个变量定义如下:

SDL_Renderer* m_renderer = nullptr;
由于错误的类型,我尝试跟踪特定的内存地址,以查看它是否有效。所以,参数。它来自我的资源管理器类,该类正在尝试向贴图添加纹理。具体代码:

bool ResourceManager::add( const std::string texture ) {
    Texture* tex;
    tex->setRenderer(m_renderer);
}
当然,这个变量(
m_renderer
)也来自不同的位置。我的
游戏

m_resources.setRenderer(m_renderer);
初始化渲染器后立即调用此函数,没有任何错误。我的追踪到此结束,没有发现问题

我还尝试在所有这些函数中打印内存地址。它们都打印完全相同的内存地址。 来自gdb的堆栈跟踪:

Thread 1 "ConceptGame" received signal SIGSEGV, Segmentation fault.
0x0000000000408868 in Texture::setRenderer (this=0x0, renderer=0x660b60)
at ../Texture.cpp:68
68      m_renderer = renderer;
(gdb) bt
#0  0x0000000000408868 in Texture::setRenderer (this=0x0, renderer=0x660b60)
at ../Texture.cpp:68
#1  0x0000000000406865 in ResourceManager::add (this=0x7fffffffdb50, 
texture="penguin.png") at ../ResourceManager.cpp:31
#2  0x0000000000403fb1 in Game::run (this=0x7fffffffdae0) at ../Game.cpp:83
#3  0x0000000000408b5f in main (argc=1, argv=0x7fffffffdcb8) at ../main.cpp:50

非常感谢您对解决此问题的任何帮助…

哇。根据安迪格的评论,我确实解决了这个问题。。。 在尝试修复此问题时,我无意中没有初始化指针,因此导致了此问题

通过初始化指针修复

Texture* tex = new Texture;
tex->setRenderer(m_renderer);

谢谢。

当gdb没有帮助时,可能是时候尝试使用
Texture*tex;tex->setRenderer(m_渲染器)这是实际代码吗
tex
在此未初始化。您可能需要将
纹理
指定给比局部变量更永久的对象。现在它看起来像是你分配,分配给它,然后扔掉它。从长远来看,这个纹理会泄漏,看起来没有多大用处。这个纹理被放在另一个位置的std::map中。当包含该映射的类调用析构函数时,我循环遍历该映射,删除所有指针并将它们设置为null。应该没问题吧?