Vin*_*ent 4 c++ memory-leaks memory-access memory-alignment c++11
请考虑以下代码:
#include <iostream>
int main()
{
char* c = new char('a');
char ac[4] = {'a', 'b', 'c', 'd'};
unsigned long long int* u = reinterpret_cast<unsigned long long int*>(c);
unsigned long long int* uc = reinterpret_cast<unsigned long long int*>(&ac[3]);
*u = 42;
*uc = 42;
std::cout<<*u<<" "<<*uc<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这被认为是有效的代码,还是内存泄漏/未定义的行为?我问,因为通过:
*u = 42;
*uc = 42;
Run Code Online (Sandbox Code Playgroud)
我们正在访问程序无法访问的字节(我猜).
*u = 42;通过违反严格别名规则导致未定义的行为.*u是一个类型的左值,unsigned long long严格的别名规则说这可能只用于访问对象(已经存在)并具有类型long long或unsigned long long.但是,您的代码使用它来访问数组char.
C++没有针对对齐访问的特定规则(与C不同).这是因为在C++中,由于以下原因之一,编写将执行未对齐访问而不会导致未定义行为的代码是不可能的: