Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 使用空的弱\u ptr作为参数调用map::count是否安全?_C++_Map_Initialization_Find_Weak Ptr - Fatal编程技术网

C++ 使用空的弱\u ptr作为参数调用map::count是否安全?

C++ 使用空的弱\u ptr作为参数调用map::count是否安全?,c++,map,initialization,find,weak-ptr,C++,Map,Initialization,Find,Weak Ptr,叫保险箱安全吗 我对C++还很缺乏经验,没有能力确定这个问题。 在我的应用程序中,weak_ptr作为map中的键,必须首先通过值找到。如果找不到,则未初始化的弱\u ptr将返回并在映射::计数中使用 代码 设置 发现 my_ptr found_ptr = get_my_ptr_from_data(data); if(my_ptrs.count(found_ptr) ){ 调用find(和count)是安全的,只要定义的顺序不依赖于指针非空。find(和count)对参数的唯一作用是将其用作

叫保险箱安全吗

我对C++还很缺乏经验,没有能力确定这个问题。

在我的应用程序中,
weak_ptr
作为
map
中的键,必须首先通过值找到。如果找不到,则未初始化的
弱\u ptr
返回
并在
映射::计数
中使用

代码 设置

发现

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

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


但是,在关联容器中将
弱\u ptr
用作密钥是不安全的。如果过期,则容器的顺序被破坏,之后尝试使用容器将给出未定义的行为。

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


但是,在关联容器中将
弱\u ptr
用作密钥是不安全的。如果过期,则容器的顺序被破坏,之后尝试使用容器将给出未定义的行为。

std::weak_ptr是否定义了比较语义?我不认为你能多演示一点你的实际代码吗?我感觉你在问一个XY问题。@Gracchus:它按预期工作-直到其中一个元素过期,并破坏了地图的顺序。然后你有了未定义的行为,因为你打破了地图的一个先决条件。您不能安全地使用
weak_ptr
作为键。本质上与
std::weak_ptr
甚至定义比较语义相同?我不认为你能多演示一点你的实际代码吗?我感觉你在问一个XY问题。@Gracchus:它按预期工作-直到其中一个元素过期,并破坏了地图的顺序。然后你有了未定义的行为,因为你打破了地图的一个先决条件。您不能安全地将
弱\u ptr
用作键。本质上与@Gracchus相同:没问题,
计数的答案是相同的,因为这与
查找
@Gracchus:这要么是错误的(如果指针有可能过期),要么是不必要的(因为,如果它们不能过期,您还可以存储共享指针,甚至原始指针)。如果共享指针不能过期,则存储共享指针而不是原始指针可能会增加不必要的开销,当然弱指针也会如此。@Deduplicator:我认为共享指针的开销与弱指针相同,但会消除任何过期的危险。原始指针会更少,如果过期,则会有不同的未定义行为.@MikeSeymour:在许多实现中
sizeof(std::shared_pointer)==2*sizeof(T*)
,因为对指针的快速访问优化了空间消耗。(它必须在某个地方保存其共享计数器).
std::weak_pointer
无法进行优化,因为它必须始终确保对象仍然存在,因此无论如何它都必须访问计数器。@Gracchus:没问题,对于
count
,答案是相同的,因为这与
find
@Gracchus:要么是错误的,要么是错误的(如果指针有可能过期)或不必要(因为,如果它们不能过期,您还可以存储共享指针,甚至原始指针)。如果共享指针不能过期,则存储共享指针而不是原始指针可能会增加不必要的开销,当然弱指针也会如此。@Deduplicator:我认为共享指针的开销与弱指针相同,但会消除任何过期的危险。原始指针会更少,如果过期,则会有不同的未定义行为.@MikeSeymour:在许多实现中
sizeof(std::shared_pointer)==2*sizeof(T*)
,因为对指针的快速访问优化了空间消耗。(它必须在某个地方保存其共享计数器).
std::weak_pointer
无法进行优化,因为它必须始终确保对象仍然存在,因此它必须访问计数器。
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) ){