c++ - 初始化指针时写访问冲突

标签 c++ directx-11 access-violation nullptr

<分区>


关闭 5 年前

我在尝试动态创建数组时遇到写访问冲突,似乎存储指针的内存地址无效。

标题:

struct FontType
{
    float left;
    float right;
    float size;
}

FontType* m_Font = nullptr;

来源:

m_Font = new FontType[60];

错误信息如下:

Exception thrown: write access violation.
this was nullptr.

运行

std::cout << &m_Font << std::endl;

返回不同的地址,例如 00000000 或 00000004,我认为这是问题所在,但我不知道如何解决。

如有任何帮助,我们将不胜感激。

最佳答案

精简版

您通过指针或引用访问的对象包含 m_Font成员无效。


长版

在您未发布的代码编年史中的某处是某个类,Foo ,它有一个成员 FontType *m_Font;某处你有这个:

struct FontType
{
    float left;
    float right;
    float size;
};

struct Foo
{
    FontType *m_Font;

    Foo() : m_Font(nullptr)
    {
    }

    void bar()
    {
        m_Font = new FontType();
    }
};

尽管使用了裸指针(坏主意),但问题源于您(仍)未发布的代码中的某处 else,看起来像这样:

int main()
{
    Foo *pf = nullptr;

    pf->bar(); // BAD - dereferencing an invalid pointer
}

如果您认为 nullptr是上面的问题,让我向你保证这同样无效:

int main()
{
    Foo *pf;

    pf->bar(); // BAD - dereferencing an indeterminate pointer
}

简而言之,bar()内的内存分配成员(member)不是问题。相反,它是指向不存在/无效对象的成员的结果指针的存储问题,并且是尝试使用无效指针或对对象的引用的直接结果实际上不是一个对象。

最好的证据是您在最后张贴的项目中透露了这一点,试图打印成员本身的地址。你是这样说的:

std::cout << &m_Font << std::endl;

似乎打印出 null,有时是 4,等等。

根据 C++ 标准,类类型成员(例如您的 m_Font )驻留在可寻址空间中,位于包含对象基址的某个可能填充的位置。在第一个成员之间甚至之后可以有填充,但从不在第一个成员之前。因此,如果 m_FontFoo 的第一个成员类,那么下面所有的地址都是等价的:

&m_Font == &this->m_Font == this

根据第一个成员之前不能有填充的要求,并且包含对象的地址等同于其第一个成员的地址。

所有这些意味着 this必须等同于 nullptr ,在执行 std::cout << &m_Font 的代码的上下文中并为输出生成一个空指针,假设 m_Font是第一个成员(实际上,如果 null 确实是打印输出,则它必须是)。

关于c++ - 初始化指针时写访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163322/

上一篇:c++ - 如何将cpp文件中的静态函数暴露给其他文件

下一篇:android - ANeuralNetworksMemory_createFromFd 是如何工作的?

相关文章:

c++ - 如何有效地计算整个像素着色器阶段使用颜色的次数?

c++ - 列出迭代器访问冲突

c++ - 当我超出数组时,Netbeans 不会给出段错误

c++ - 特定于平台的 lib 文件应如何命名?

c++ - directx11 点光源问题。从原点平移的对象没有正确点亮

c++ - 使用c++/WinRT Direct3D UWP Game DR模板Direct X11的错误消息

c++ - 函数 bool isnan( … ) 在 C++ 中的定点实现

C++继承问题

c++ - 访问冲突读取数组元素

delphi - 在这种情况下,为什么需要在调用 AviFileExit() 之前取消 IAviFile 指针?