【问题标题】:Is calling map::count with an empty weak_ptr as argument safe?使用空的 weak_ptr 作为参数调用 map::count 是否安全?
【发布时间】:2023-04-03 15:35:01
【问题描述】:

uninitialized thus empty weak_ptr 保险箱上调用map::count 是否安全?

我对 c++ 还很缺乏经验,也没有能力确定这一点。

在我的应用程序中,weak_ptr 被保存为 map 中的键,并且必须首先通过值找到。如果找不到,则未初始化的weak_ptrreturned 并在map::count 中使用。

代码

设置

map<my_ptr, connection_data, owner_less<my_ptr>> m_connections;
typedef map<my_ptr, connection_data, owner_less<my_ptr>>::iterator it;

按数据查找

my_ptr get_my_ptr_from_data(string data){
    my_ptr my_ptr_to_send;
    for(it iterator = my_ptrs.begin(); iterator != my_ptrs.end(); iterator++) {
        if(iterator->second.data == data){
            my_ptr_to_send = iterator->first;
            break;
        }
    }
    return my_ptr_to_send;
}

发现

my_ptr found_ptr = get_my_ptr_from_data(data);
if(my_ptrs.count(found_ptr) ){

【问题讨论】:

  • std::weak_ptr 是否定义了比较语义?我不这么认为
  • 您能多演示一下您的实际代码吗?我感觉你在问一个 XY 问题。
  • @Gracchus:它按预期工作-直到其中一个元素过期,并破坏了地图的顺序。然后你有未定义的行为,因为你已经打破了地图的先决条件之一。您不能安全地使用 weak_ptr 作为密钥。
  • this基本相同

标签: c++ map initialization find weak-ptr


【解决方案1】:

调用find(和count)是安全的,只要您定义的任何顺序不依赖于非空指针。 find(和count)对该参数唯一能做的就是将它用作比较器的参数。

但是,使用weak_ptr 作为关联容器中的键并不安全。如果过期,则容器的顺序被破坏,之后尝试使用容器将产生未定义的行为。

【讨论】:

  • @Gracchus:没问题,count 的答案是一样的,因为它和find 做的事情或多或少是一样的。
  • @Gracchus:要么是错误的(如果指针有可能过期)要么是不必要的(因为如果它们不能过期,你不妨存储共享指针,甚至原始指针) .
  • 如果它们不能过期,存储 shared_pointer 而不是原始指针可能会像weak_pointer一样增加不必要的开销。
  • @Deduplicator:我认为共享指针的开销与弱指针相同,但会消除任何过期的危险。如果原始指针确实过期了,它们的未定义行为会更少,并且会出现不同的风格。
  • @MikeSeymour:在许多实现中sizeof(std::shared_pointer) == 2 * sizeof(T*),因为对指针的快速访问已针对空间消耗进行了优化。 (它必须在某个地方保存它的共享计数器)。 std::weak_pointer 无法进行优化,因为它必须始终确保对象仍然存在,因此无论如何它都必须访问计数器。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2011-10-31
  • 2016-11-27
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2019-05-02
相关资源
最近更新 更多