在函数中释放内存 前几天我要问一个相当简单的初学者问题,关于C++函数,当我意识到我没有为我的函数释放内存时。在这里似乎永远不会有好的结局
这似乎是一个常见的问题,但在我对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(
#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;
}