gpt4 book ai didi

c++ - 删除后指向列表元素的指针

转载 作者:行者123 更新时间:2023-11-28 00:18:47 24 4
gpt4 key购买 nike

我有一个存储对象的列表。

list<MyObject> l;

我还有一个方法返回指向这些对象之一的指针(如果存在),否则返回 nullptr。

MyObject* get(int x) {
for (std::list<MyObject>::iterator it = l.begin(); it != l.end(); ++it) {
if (it->X == x) {
return &(*it);
}
}
return nullptr;
}

如果我 get() 一个指向某个元素的指针,并且在我使用它时,它会从另一个线程中删除,指针变得无效,然后就会发生奇怪的事情:)

我想知道的是是否有一种方法可以在 get() 中返回某种特殊类型的指针,这样如果我对一个元素调用删除并且该元素仍在被引用,它的内存将不会被释放直到指向它的指针超出范围。

我考虑过使用引用,但我需要在 get 时返回 nullptr 的可能性,这样我就可以从调用者那里检查返回值是否确实是一个有效对象。

有人可以建议更好的方法来避免这些内存问题吗?

最佳答案

按照建议,您应该使用一些 smart_pointer 来管理共享所有权。

一些建议:

  • 始终使用默认值,std::vector
  • 如果可以使用 C++11,则使用标准的 shared_ptr 实现共享所有权,如果不能,则使用 boost 版本。
  • 使用algorithm标题尽可能多(在本例中 find_if 是正确的)。

您还应该尝试使用该算法来搜索特定元素。这是一些示例代码:

#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>

struct MyObject {
int X;
MyObject(int x_value) : X(x_value) {}
};

using element_t = std::shared_ptr<MyObject>;

std::vector<element_t> l{
std::make_shared<MyObject>(3), std::make_shared<MyObject>(4),
std::make_shared<MyObject>(5), std::make_shared<MyObject>(6),
std::make_shared<MyObject>(7), std::make_shared<MyObject>(8)};

element_t get(int x) {
auto it = std::find_if(std::begin(l), std::end(l),
[x](const element_t& elem) { return elem->X == x; });

element_t found;
if (it != std::end(l)) {
found = *it;
}
return found;
}

int main() {
auto f1 = get(6);
if (f1) {
std::cout << "encontrado " << f1->X << std::endl;
} else {
std::cout << "6 no se encontro" << std::endl;
}

auto f2 = get(10);
if (f2) {
std::cout << "encontrado " << f2->X << std::endl;
} else {
std::cout << "10 no se encontro" << std::endl;
}

return 0;
}

关于c++ - 删除后指向列表元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28632419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com