【发布时间】:2021-12-29 07:01:22
【问题描述】:
我创建了一个简单的项目只是为了测试删除变量的工作原理,但我遇到了一件奇怪的事情...... 我创建了三个 int 变量(1 个基于堆栈和 2 个基于堆),当我使用 delete 删除堆变量时,我仍然可以访问它们。我可以打印它们或更改它们的值,但如何?删除不应该从内存中永久删除变量,还有另一个问题....为什么不能使用 free() 或 delete 删除基于堆栈的变量?
这是 (C++) 脚本 -
#include<iostream>
using namespace std;
void Stuff()
{
int* heap_int = (int*)malloc(4); //Heap based variable
*heap_int = 500;
int stack_int = 5; //Stack based variable
int* calloc_int = (int*)calloc(1,2); //Heap based variable
*calloc_int = 600;
std::cout << "Value (HeapInt) : " << *heap_int << "\n"; //Prints 500
std::cout << "Value (CallocInt) : " << *calloc_int << "\n"; //Prints 600
std::cout << "Value (StackInt) : " << stack_int << "\n"; //Prints 5
delete heap_int;
delete calloc_int;
//delete stack_int; (will not work)
std::cout << "\nValue after delete (HeapInt) : " << *heap_int << "\n"; //Still prints 500
std::cout << "Value after delete (CallocInt) : " << *calloc_int << "\n"; //Still Prints 600
std::cout << "Value after delete (StackInt) : " << stack_int << std::endl; //Prints 5
*heap_int = 82;
}
int main()
{
Stuff();
}
我在在线教程中听说,基于堆的变量只有在我们使用 delete 或 free() 时才会被释放(不像堆栈变量在其作用域结束时自动释放)那为什么我不能像这样访问基于堆的变量超出范围...?
#include<iostream>
void Function()
{
int* variable = new int;
*variable = 6;
}
int main()
{
*variable = 9; //Error says "Use of Undeclared identifier variable"
}
【问题讨论】:
-
当您调用
delete或free时,并不意味着内存位置消失得无影无踪。该位置仍然存在,只是访问它是未定义的行为。 -
malloc不是 C++。malloc与free一起使用,其中delete与new一起使用,构造函数、析构函数和其他东西。 -
@Sandburg 从技术上讲,malloc 仍然存在,但您无法使用它创建对象。请注意,C++ 核心指南建议不要使用 new/delete,而是使用 std::make_unique 以避免内存泄漏和对指针的明确所有权进行建模。 (isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 并查找与 new/delete/pointers 相关的内容)
-
在 C++ 范围内定义得非常好,在一个范围内声明的任何变量都不能在该范围外访问。所以至少在 C++ 中应该是这样的。注意:不要使用“使用命名空间标准”
-
啊!抱歉....我忘了删除 using namespace std ????顺便说一句,感谢所有回答的人
标签: c++ heap-memory