当前位置: 首页 > 知识库问答 >
问题:

分配内存指针

江正德
2023-03-14

我想知道何时或是否必须删除此对象。下面是一个基本类对象Object.cpp的构造函数:

Objects::Objects{
    Obj one = new Obj;
    Obj two = new Obj;
}

我知道在分配内存时,你应该在某个时候删除它,但是我在构造函数中分配了内存,并且想再次使用变量1和2,我什么时候删除它们?

共有2个答案

蒲魁
2023-03-14

我想知道何时或是否必须删除此对象。

如果使用new分配而不释放,则会泄漏内存。

我已经在构造函数中分配了内存,想再次使用变量一和两,我什么时候删除它们?

如果您想在构造函数中初始化变量并在以后使用它们,那么您应该在构造函数中使用非静态成员变量而不是自动变量。

如果您要在构造函数中分配内存,并用一个成员指向它,那么通常您应该在析构函数中释放内存。有关更多信息,请参见资源获取是初始化习惯用法。但是,您不应该使用裸露的拥有指针,也不应该不必要地使用动态分配。下面是一个简单的示例,我推荐您作为第一个选项:

struct Objects {
    Obj objects[2];
};
经和歌
2023-03-14

为了简单起见,任何时候创建new时,都应该创建相应的delete

在您的情况下,您必须最迟在删除您的对象obj之前删除已分配的对象object,这意味着在objects析构函数中,这也意味着您必须保留一种方法来访问析构函数处的一个两个指针(一种方法可能是使它们成为objects的成员)。您当前的案例无法这样做,因为OneTwo是局部变量,而不是指针。

可能如下所示:

class Objects
{
public:
  Objects();
  virtual ~Objects();
private:
  Obj* one;
  Obj* two;
};

Objects::Objects{
    one = new Obj;
    two = new Obj;
}

Objects::~Objects{
    delete one;
    delete two;
}

在处理资源管理时,您需要注意一些规则,这是三/五/零规则,它将指导您在资源管理方面创建健壮的代码。

另一个说明:使用智能指针可能更好,因为即使使用我在文章中提到的方法,如果在代码执行delete行之前发生了异常或崩溃,您仍然会出现内存泄漏,正如这里所解释的

 类似资料:
  • 我有一个func添加两个NO并返回(a+B)。然后我创建了一个指向func的func指针。希望为该函数指针的数组分配内存并访问它们。代码如下。 我的问题是使用malloc的下面一行: 编译时,sizeof(add_2nos*)和sizeof(add_2nos)没有任何区别。如果有什么区别??另外,如果类型转换是必要的,而我正在分配相同类型的内存…?

  • 在用C进行编码练习时,我必须为指向结构()的指针分配内存,即使该结构可能已经预先为它分配了内存,否则我将得到“赋值到空指针”类型的错误。 我的假设是,如果指针要指向一个预先分配内存的结构,那么分配更多的内存将是冗余的?为了澄清,代码编译和运行都没有错误,只是搞不清楚为什么我需要分配内存来实现预期的行为。 这里有一个链接到一个要点,以了解完整的上下文。谢了!

  • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理