使用空类类型的对象的内存
Using the memory of an object of an empty class type
由于在C++中,空类的sizeof
是1个字节,因此以下代码有效吗?
class A
{
};
int main()
{
A a;
char* p = reinterpret_cast<char*>(&a);
*p = 'a';
}
我知道这很没用,但我只是想看看我能不能做到。它在MSVC2010上编译并运行良好。
C++03标准1.8 C++对象模型:
§1的相关部分:对象是存储区域。。。有些对象是多态的。。。对于其他对象,对其中找到的值的解释由用于访问它们的表达式的类型决定";
在您的示例中,a
是一个具有自动存储持续时间的对象,当执行离开作用域时,该对象将被解除分配。基本上,它所在的内存对你来说是可用的,你可以在那里存储你想要的任何东西:
int i;
char* myStr = reinterpret_cast<char*>(&i);
myStr[0] = 'H';
myStr[1] = 'i';
myStr[2] = '!';
myStr[3] = ' ';
std::cout << myStr;
(完整示例在这里)
在这里你应该考虑的是你";滥用;通过这种方式,也就是说,即使在对象被释放后,如果仍然保留指向该内存的指针,那么访问该内存将导致未定义的行为。
请注意,仅仅因为语言允许你做某事,并不意味着你应该做。按照应该使用的方式使用这种语言的功能。毕竟,你写代码并不是为了";它起作用";。
对于你关于空课规模的问题,标准的同一部分也说:
§4:如果一个完整的对象、数据成员(9.2)或数组元素是类类型,则其类型被认为是派生最多的类,以将其与任何基类子对象的类类型区分开来;派生最多的类类型的对象称为派生最多的对象。
§5:除非是位字段(9.6),否则派生最多的对象应具有非零大小,并应占用一个或多个字节的存储。基类子对象的大小可能为零。POD类型(3.9)的对象应占用连续的存储字节。
因此,标准保证像您这样的空类的对象将占用至少1个字节。
相关文章:
- 迭代时从向量和内存中删除对象
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 对具有动态分配的内存和析构函数的类对象的引用
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 准确了解对象在内存中的映射方式
- 完全释放静态对象内存
- C++ 对象内存管理
- 循环中的自动变量和自动对象内存分配
- 每个对象内存分配有多少开销
- 是隐式创建的默认构造函数,负责分配对象内存
- 使用 make_unique 语句重新分配unique_ptr对象 - 内存泄漏
- C++对象内存布局
- C++对象内存消耗
- 谷歌模拟全局模拟对象内存泄漏
- 静态工厂方法和静态对象内存泄漏
- 关于对象内存布局的假设
- 如果我在管理C++对象内存的目标 C 中混合C++代码,ARC 会处理它