gpt4 book ai didi

c++11 - 可以忽略在内存读取(不写入)期间引起的 SIGSEGV 吗?

转载 作者:行者123 更新时间:2023-12-02 02:43:27 27 4
gpt4 key购买 nike

我可以忽略由于无效读取(不是写入)而导致的 SIGSEGV 吗?因为我是在 Windows 中编写的,所以我要使用 __try {}/__catch{} block 来捕获它。我成功地捕获了它并忽略了它。我的问题主要是因为我只是想读取内存而不是尝试向其中写入任何内容,读取会导致损坏吗?还是安全?

class Object {
int first;
int second;
bool safe;

public:
Object() {
safe = true;
}

bool isSafe() {
return safe;
}

最佳答案

根据问题评论和 C++11 标记,您可以在此处使用一些方法:

  1. 删除 一个指针之后没有将其设置为nullptr 是不正确的;如果此类代码站点在您的控制之下,请在那里进行更正。 (还请注意,如果其他东西针对 nullptr 调用 delete,它是一个安全的空操作。)如果指针被复制并存储在别处,这会有点棘手,但是, 这导致...
  2. 可能考虑使用一些其他方式来存储这些对象,例如容器类型中的实例(与通过指针不同),或者,如果您必须使用指针,则使用 std::shared_ptrstd::weak_ptr 相反,如果程序设计允许确定谁“拥有”实例的概念(并且您可以执行这样的更改而不会破坏太多东西)。如果你的代码接受一个weak_ptr,你通过weak.lock()把它转换成一个shared_ptr来使用;如果它恰好通过了一个 weak_ptr,而其他地方相应的 shared_ptr 都消失了(底层实例因此被删除)结果将是零等价的——因此自然会进入 if 语句的 else 分支。
  3. 如果您不能执行#1 或#2,那么问题中的 try-catch 方法可能是可行的,但在尝试访问对象本身时这样做;如果在空指针上尝试,字段和实例方法都会导致相同的访问冲突,因此您最好删除 isSafe() 的代码。如果您这样做,您的 catch 处理程序应该执行清理代码来更正指针本身——但是,您的其余代码可能会使这变得棘手,具体取决于指针被传递的次数。

如果这个问题出现在我们的一个代码库中,我的首选是#2,然后是#1,最后是#3。

关于c++11 - 可以忽略在内存读取(不写入)期间引起的 SIGSEGV 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57602155/

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