Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在函数中释放内存 前几天我要问一个相当简单的初学者问题,关于C++函数,当我意识到我没有为我的函数释放内存时。在这里似乎永远不会有好的结局_C++_Memory Management - Fatal编程技术网

在函数中释放内存 前几天我要问一个相当简单的初学者问题,关于C++函数,当我意识到我没有为我的函数释放内存时。在这里似乎永远不会有好的结局

在函数中释放内存 前几天我要问一个相当简单的初学者问题,关于C++函数,当我意识到我没有为我的函数释放内存时。在这里似乎永远不会有好的结局,c++,memory-management,C++,Memory Management,这似乎是一个常见的问题,但在我对c语言的理解水平上,我找不到任何东西++ 如何正确地释放此代码中的内存 #include <iostream> class thing{ public: int a; }; thing makeThing(){ thing *t = new thing; t -> a = 5; return *t; } int main(){ thing thing1 = makeThing(

这似乎是一个常见的问题,但在我对c语言的理解水平上,我找不到任何东西++

如何正确地释放此代码中的内存

#include <iostream>

class thing{
    public:
    int a;
    };

thing makeThing(){
    thing *t = new thing;
    t -> a = 5;
    return *t;
    }

int main(){
    thing thing1 = makeThing();
    std::cout << "a: " << thing1.a << std::endl; 
    return 0;
    }

但基于内核转储,我认为这不是解决问题的方法。

有时释放内存的最简单方法是不首先分配内存:

thing makeThing(){
    thing t;
    t.a = 5;
    return t;
}
您试图做的事情不起作用的原因是:

delete &thing1;
这是本地对象的地址。。。那不是你实际分配的地址。那一个被复制到你的,现在你没有办法访问它

如果要分配
对象
,则需要直接返回指针。最好以某种方式包装:

std::unique_ptr<thing> makeThing() {
    std::unique_ptr<thing> t(new thing);
    t->a = 5;
    return t;
}
std::unique_ptr makeThing(){
std::unique_ptr t(新事物);
t->a=5;
返回t;
}
导致立即内存泄漏。
t
变量将在
makeThing()
返回后超出范围,并且分配的内存将永远不会释放,也不会使用适当的
delete
语句访问释放

返回了新创建的
t
的副本

要修复它,只需创建一个局部变量并重新运行副本:

thing makeThing(){
    thing t;
    t.a = 5;
    return t;
}

由于您是按值返回的,这意味着您将返回对象的副本。函数返回后,无法访问由新事物创建的原始对象(无论如何都不可靠)

您可以返回一个指针:

thing* makeThing(){
  thing *t = new thing;
  t -> a = 5;
  return t;
}
并删除该项


但是,在这种情况下,您应该只返回一个对象,甚至不使用
new
分配任何内容。

如果您真的想使用
new
这是正确的方法。这段代码是C++11,因此如果您正在使用的编译器中还没有默认选项,那么您可能需要启用某些选项。我习惯于使用C++11,因为该语言版本的改进确实值得

#include <iostream>
#include <memory>
#include <ostream>

class thing {
public:
  int a;
};

std::ostream& operator<<(std::ostream& os, const thing& t) {
  os << t.a;
  return os;
}

std::unique_ptr<thing> makeThing() {
  std::unique_ptr<thing> t(new thing); 
  t->a = 5;
  return std::move(t);
}

int main() {
  auto thing1 = makeThing();
  std::cout << "a: " << *thing1 << std::endl; 
  return 0;
}

ostream插入器不需要更改,因此我省略了它。类定义也是如此。

makeThing
中有内存泄漏,我该如何修复?这种风格的编码直接来自我的课本,所以我真的不知道有什么不同的方法。如果这是从你的课本中产生的,那么就开始用它来达到更好的目的。用它擦你屁股@什么书?如果这在书中是真的(而且你没有复印错),请发布一个例子的扫描,这样我们就可以把它列入黑名单。这是有道理的。谢谢Lucian,我把这个函数做成了一个指针,现在我可以调用并释放它了。一个名字很棒的人给了我一个极好的回答。@BarryTheHatchet Swoon。谢谢James。我知道这是可以做到的,但如果我试图在运行时添加大量的对象,并设置许多变量,我不一定要这样做吗?不一定。。例如,您可以在像
std::vector
这样的数据结构中拥有数百万或数十亿个
类对象的实例,而无需使用
new
。当然,
std::vector
的实现可能会在内部使用new.Right。Vector似乎可以处理所有的内存管理,但我正在阅读一个制作二叉树(学习目的)的教程,并对此进行了讨论。我想最短的有用答案是,如果您正在编写代码来创建一个从头开始的数据结构,其大小是无限的,是的,您需要使用
new
make_unique
(在下面,它的行为就像调用new一样)。。
thing* makeThing(){
  thing *t = new thing;
  t -> a = 5;
  return t;
}
#include <iostream>
#include <memory>
#include <ostream>

class thing {
public:
  int a;
};

std::ostream& operator<<(std::ostream& os, const thing& t) {
  os << t.a;
  return os;
}

std::unique_ptr<thing> makeThing() {
  std::unique_ptr<thing> t(new thing); 
  t->a = 5;
  return std::move(t);
}

int main() {
  auto thing1 = makeThing();
  std::cout << "a: " << *thing1 << std::endl; 
  return 0;
}
#include <iostream>
#include <ostream>

thing makeThing() {
  thing t;
  t.a = 5;
  return t;
}

int main() {
  auto thing1 = makeThing();
  std::cout << "a: " << thing1 << std::endl; 
  return 0;
}