微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果我在函数中使用指针来填充列表,是否需要在c ++中删除该函数末尾的指针?

如何解决如果我在函数中使用指针来填充列表,是否需要在c ++中删除该函数末尾的指针?

如果在函数中使用指针填充列表,是否必须在函数末尾删除该指针,否则列表的析构函数将在c ++中完成工作?

例如:

void populateList() {
  Human* human;
  List<Human> myList;

  for (int i = 0; i < 5; ++i) {
    human = new Human();
    myList.push_back(*human);
  }
}

我应该删除函数末尾的指针,还是不需要它,因为它不是内存泄漏?

解决方法

在这一行:

myList.push_back(*human);

您正在制作human指针所指向的动态分配对象的副本,因此myList析构函数只会清除该副本。您确实需要手动释放human指向的动态分配的内存,以避免泄漏该内存。

但是,在这种情况下,似乎根本没有理由使用new动态分配内存。您可以只创建一个本地Human并将其添加到myList中。这样就不会有内存泄漏的问题了 是没有动态分配的,并且所有对象超出范围都会被正确清理。

,

您无需在此处使用指针,只需执行以下操作即可:

void populateList() {
  List<Human> myList;

  for (int i = 0; i < 5; ++i) {
    Human human; //if the constructor of human creates the same thing every time,you could also put this line before the for loop
    myList.push_back(human);
  }
}

在c ++中声明变量也会对其进行构造。

您正在做的是创建一个指针,而不是创建Human的新实例并使该指针指向该实例。比起基本上将其复制到列表,因为您只给列表提供了一个副本。即使您愿意,它也无法删除您的指针,因此您应该删除人工实例。如果您确实坚持使用指针,则应该这样做:

void populateList() {
  Human* human;
  List<Human> myList;

  for (int i = 0; i < 5; ++i) {
    human = new Human();
    myList.push_back(*human);
    delete human;
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。