【问题标题】:Create and destroy an object in a loop在循环中创建和销毁对象
【发布时间】:2015-02-21 21:18:42
【问题描述】:

我是 C++/stacko 新手,主要想:

  1. 创建一个对象
  2. 为此读取大量数据
  3. 计算该对象的分数后,将其打印出来
  4. 从内存中删除对象,因为每个对象都有很多变量归属于它
  5. 循环 1000 次

看起来很简单,但环顾四周后,我看到了关于析构函数的东西,但我不知道这是否是我要找的。​​p>

for(int i=0; i<1000; i++){
    applicants object1;
    object1.readin();
    cout<<object1.calculate();
    //How do I delete object1 and start again?
}

非常感谢您的帮助。我对这种语言几乎一无所知。另外,我什至需要对象吗?我很困惑

【问题讨论】:

  • 目前的代码很好。在块(循环体)的末尾,您的 object1 被销毁,即调用其析构函数。大多数情况下这是自动的,如果你使用例如std::vector 为您提供您没有考虑过的数据。
  • 您的对象是在堆栈上创建的,因此一旦超出范围就会自动销毁,这发生在每个循环之后。
  • 除非他使用指向动态内存的指针。你最好给我们“申请人”的声明。
  • 你懒得写完整的“堆栈溢出”?!
  • @LightnessRacesinOrbit 我现在可以成为酷哥的一员吗?

标签: c++ object


【解决方案1】:

不需要删除object1。

对于循环的每次迭代,都会创建一个新对象 object1(使用默认构造函数)并在“cout”语句之后销毁。

【讨论】:

  • 这是真的,因为对象直接在堆栈上,而不是用指针分配在堆上(通过new)。使用new 制作的对象必须是deleted。
【解决方案2】:

你不需要调用object1的析构函数,它会在循环体结束时调用。

从技术上讲,在声明对象的块的末尾(右大括号)调用析构函数。

这就是为什么右大括号 } 有时被戏称为 C++ 中最重要的语句。那时可能会发生很多事情。

然而,在构造函数或析构函数中进行实际计算通常被认为是不好的风格。您希望他们“分配”和“取消分配”资源。阅读更多关于 RAIIrule of five(或三个)的信息。

顺便说一句,如果exception 发生,throw 和匹配的catch 之间的析构函数也会被触发。

请详细了解 C++ containers。您可能希望您的 applicants 类使用一些。也许它应该包含一些std::vector type 的字段。

另外学习C++11(或C++14),而不是一些旧版本的标准。因此,使用带有-std=c++11 选项的最新编译器(例如,至少GCC 4.9,如g++,或至少Clang/LLVM 3.5,如clang++)(不要忘记使用-Wall -Wextra 启用警告,使用-g 调试信息以使用gdb 进行调试,但在进行基准测试时至少启用optimizations,例如使用-O2)。 现代 C++11(或C++14有几个非常重要的特性(以前的标准中缺少)当@987654331 时非常有用 @。您可能还应该使用makehere 我解释了原因),参见例如this 和其他示例。另见valgrind

【讨论】:

    【解决方案3】:

    对象一在结束括号超出范围时将被自动删除。你已经在做。请小心,就好像您创建了一个指针,当它超出范围时它不会被破坏。但是您当前的代码运行良好。

    http://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      相关资源
      最近更新 更多