为什么我能够增加指向单个新 int 位置的指针?令人惊讶的是它运作良好
Why am I able to increment a pointer pointing at a single new int location? and the surprisingly it works well
这里发生了什么它正在工作,但它仍然不明确。谁能告诉我更多关于这方面的信息,或者至少让我指向一些相关资源以了解更多信息
#include <iostream>
#include <string>
int main()
{
std::string br="\n";
long *a=new long;
*++a=121;
*++a=545454;
*++a=232;
std::cout<<*a<<br<<a<<std::endl;
a--;
//delete a;
std::cout<<*a<<br<<a<<std::endl;
a--;
//delete a;
std::cout<<*a<<br<<a<<std::endl;
delete a;
pause;//macro for windows("pause")
}
你所做的并不是真正的惊喜,但它并没有被定义为顺利。
当您使用对象调用 new 时,堆分配器会分配一些 space 来存储您的对象。
你所做的只是增加指向一些未分配内存的指针。正如您所注意到的,您可以写入它,但它会导致未定义的行为,因为还可能存在另一个由您分配的对象,或者您可以覆盖堆使用的一些数据结构来组织其内存。
长话短说,不要写入你之前没有分配的内存。
这是有效的,因为 a
是指向堆中内存位置的长指针。堆由一大块内存组成,将在 运行 次使用。简而言之,在递增a
时,a
指向下一个(可能不连续)由new分配的内存位置。
一些参考文献:
https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/
这里发生了什么它正在工作,但它仍然不明确。谁能告诉我更多关于这方面的信息,或者至少让我指向一些相关资源以了解更多信息
#include <iostream>
#include <string>
int main()
{
std::string br="\n";
long *a=new long;
*++a=121;
*++a=545454;
*++a=232;
std::cout<<*a<<br<<a<<std::endl;
a--;
//delete a;
std::cout<<*a<<br<<a<<std::endl;
a--;
//delete a;
std::cout<<*a<<br<<a<<std::endl;
delete a;
pause;//macro for windows("pause")
}
你所做的并不是真正的惊喜,但它并没有被定义为顺利。
当您使用对象调用 new 时,堆分配器会分配一些 space 来存储您的对象。
你所做的只是增加指向一些未分配内存的指针。正如您所注意到的,您可以写入它,但它会导致未定义的行为,因为还可能存在另一个由您分配的对象,或者您可以覆盖堆使用的一些数据结构来组织其内存。
长话短说,不要写入你之前没有分配的内存。
这是有效的,因为 a
是指向堆中内存位置的长指针。堆由一大块内存组成,将在 运行 次使用。简而言之,在递增a
时,a
指向下一个(可能不连续)由new分配的内存位置。
一些参考文献:
https://www.geeksforgeeks.org/stack-vs-heap-memory-allocation/