C++ 删除指针和对象

C++ 删除指针和对象,c++,C++,如何删除指针及其指向的对象 下面的代码会删除该对象吗 Object *apple; apple = new Object(); delete apple; 如果指针没有被删除,并且超出范围,会发生什么 Object *apple; apple = new Object(); 这可能是一个非常基本的问题,但我来自Java。您的第一个代码片段确实删除了对象。指针本身是在堆栈上分配的局部变量。一旦超出范围,它将被解除分配 这就引出了第二点——如果在取消分配堆上分配的对象之前指针超出了作用域,那么

如何删除指针及其指向的对象

下面的代码会删除该对象吗

Object *apple;
apple = new Object();

delete apple;
如果指针没有被删除,并且超出范围,会发生什么

Object *apple;
apple = new Object();

这可能是一个非常基本的问题,但我来自Java。

您的第一个代码片段确实删除了对象。指针本身是在堆栈上分配的局部变量。一旦超出范围,它将被解除分配

这就引出了第二点——如果在取消分配堆上分配的对象之前指针超出了作用域,那么您将永远无法取消分配它,并且将出现内存泄漏

希望这有帮助

下面的代码会删除该对象吗

Object *apple;
apple = new Object();

delete apple;
是的,会的。但指针未被删除,删除后意外使用指针将导致错误

如果指针没有被删除,并且超出范围,会发生什么

Object *apple;
apple = new Object();

内存泄漏将会发生。

当您对指针调用
delete
时,它会释放指向的对象的内存。换句话说,您不需要释放组成指针变量的内存,只需释放指向的对象即可。因此,您的代码:

Object *apple;
apple = new Object();

delete apple;
正确删除对象,并且不会出现内存泄漏


如果不调用delete,并且变量超出范围,则会出现内存泄漏。这些可能很难跟踪,因此建议使用智能指针类。

运算符
删除
删除以前分配了运算符new的指针指向的对象

指针本身不会更改,甚至会具有与调用运算符之前相同的值。但是,删除对象后,其值将变为无效

如果指针本身是一个局部变量,那么在控件离开指针的声明区域后,它将被销毁

如果指针具有静态存储持续时间,则当程序完成其执行时,指针将被销毁

考虑到您可以使用智能指针而不是原始指针

比如说

std::unique_ptr<Object> apple( new Object() );
std::unique_ptr apple(新对象());

在这种情况下,你不需要调用<代码>删除>代码>它是智能指针,它将完成所有的工作。

< P>你好,欢迎来到C++土地!你会喜欢你多么讨厌它(或类似的东西)。C++在看似未经训练的眼睛中看起来与java相似,但实际上语义上却有很大的不同。让我们看看C++中的这些语义如何在你的问题中发挥作用。首先让我们来上课:

class Foo {
public:
    Foo() { std::cout << "In constructor\n"; }
    ~Foo() { std::cout << "In destructor\n"; }
};
如果我们运行这样的代码,我们会看到:

In constructor
In destructor
In constructor
这是因为,当创建对象时,它是使用构造函数构造的。当它退出时,将调用析构函数(~Foo)来解构(或销毁)对象。这实际上是C++中一种相当普遍和强大的特性(即,与其他形式的向系统返回内存的方法相反)。有了这些新知识,让我们看看当我们使用指向Foo的指针时会发生什么:

{
    Foo *bar = new Foo();
    some_more_stuff(bar);
}
这里发生的是我们将看到:

In constructor
In destructor
In constructor
这是因为指针是如何分配的,而变量是如何分配的。按照指针的分配方式,它们通常不会超出范围,但它们的内容确实超出范围。这被称为悬挂指针。要获得更好的示例,请查看以下内容:

#include <iostream>

int* get_int() {
    int qux = 42;
    int *foo = &qux;
    return foo;
}

int main() {
    int *qazal = get_int();
    std::cout << *qazal;
}
#包括
int*get_int(){
int-qux=42;
int*foo=&qux;
返回foo;
}
int main(){
int*qazal=get_int();

STD::虽然它们共享一些基本的语法,但是C++和java是非常不同的。你应该考虑在C++上找到一本现代书籍来学习它(在现代C++中,你可以通过使用容器类或智能指针来避免原始内存分配)。指针只是一个变量,你不必删除指针本身。你不能通过问问题来学习C++,它将花费成千上万的问题和几千天。得到一本书。这里有一个推荐书的列表:它非常类似于java;当执行到达变量的范围的末端时,变量就不再存在,而是它所指的对象不是。很好的解释,我建议如果@KaareZ还需要什么,他需要在堆栈和堆内存上读一些东西。谢谢:)向人们展示指针不需要很大,而且很可怕。像get_int中那样返回堆栈上分配的内存地址是危险的。qux的内存,以及通过扩展,qazal可能会被cout对象的操作符的调用覆盖是的,我并不是建议使用悬空指针。这是危险的,也是一个坏主意。我只是告诉他如果不删除指针和范围更改会发生什么