C++ 使用空的弱\u ptr作为参数调用map::count是否安全?
叫保险箱安全吗 我对C++还很缺乏经验,没有能力确定这个问题。 在我的应用程序中,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)对参数的唯一作用是将其用作
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) ){