<分区>
编辑问题以包含 desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem .这将有助于其他人回答问题。
关闭 5 年前。
<分区>
编辑问题以包含 desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem .这将有助于其他人回答问题。
关闭 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_Font
是 Foo
的第一个成员类,那么下面所有的地址都是等价的:
&m_Font == &this->m_Font == this
根据第一个成员之前不能有填充的要求,并且包含对象的地址等同于其第一个成员的地址。
所有这些意味着 this
必须等同于 nullptr
,在执行 std::cout << &m_Font
的代码的上下文中并为输出生成一个空指针,假设 m_Font
是第一个成员(实际上,如果 null 确实是打印输出,则它必须是)。
关于c++ - 初始化指针时写访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50163322/