- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我是 C++ 的初学者。我正在使用 GCC 9.2.0 编译我的代码。最近我偶然发现了一些奇怪的行为,这让我陷入了段错误。
我有一个特定的 Hyperscan 类包装器。我已经做到了,所以它基本上具有与 Python 的 re 相同的功能,但速度快很多倍并且是多线程的。我有一个 regex
类,我通常这样分配
auto some_regex = regex();
现在,对于那些不熟悉 Hyperscan 的人来说,构造函数的作用是 2(实际上是 3)件事 -> 首先它为正则表达式数据库分配内存。这是通过调用他们在 C 中的 API 来完成的。然后,如果成功,您将分配暂存空间。现在,因为我的实现支持多线程,所以我的类实例包含一个成员,它是一个暂存空间 vector 。尽管如此,我还是为我使用的每个线程分配了一个暂存空间,还有它们的 API。然后我得到一个指向已编译正则表达式数据库的指针和一个临时空间指针 vector 。
解构对象时,我必须释放数据库和暂存空间(我还使用 API 提供的函数)(如果已分配)。到目前为止,一切都很好。当我做这样的事情时,问题就出现了:
auto some_regex = regex();
some_regex = regex(R"(\s+)");
你看到这里有问题了吗?也许我太菜鸟看不到它,但它对我来说看起来不错。但是没有。它在试图释放数据库内存时在析构函数中出现段错误。调试它,我遇到了这些操作:
allocate memory for some_regex
initialize some_regex
allocated new memory for some_regex
initialize new some_regex
run destructor for the old some_regex
run destructor for the new some_regex
基本上,第一个实例的析构函数仅在第二个实例的构造函数触发后运行。这实际上是为了让第一个析构函数释放由第二个构造函数分配和初始化的数据,而不是仅仅清理自身。
现在,事情变得更奇怪了。我查看了手头的地址,因为我开始将释放的指针设置为 nullptr - 结果发生了这种情况:
allocate memory for some_regex
initialize some_regex
allocated new memory for some_regex
initialize new some_regex
run destructor for the old some_regex
database pointer is not 0, free it
set database pointer to nullptr
run destructor for the new some_regex
database pointer is not 0, free it (BUT THIS IS ALREADY FREED MEMORY???)
SIGSEGV
我完全糊涂了。即使在将数据库指针显式设置为 null 之后,新指针也会在构造函数完成其工作后为其分配一个新地址。
这重现了行为:
#include <iostream>
#include <malloc.h>
mock::mock()
{
std::cout << "Starting constructor..." << std::endl;
this->test = (int*)malloc(sizeof(int));
*this->test = 0;
std::cout << "Ending constructor..." << std::endl;
}
mock::mock(int x)
{
std::cout << "Starting full constructor..." << std::endl;
this->test = (int*)malloc(sizeof(int));
*this->test = x;
std::cout << "Ending full constructor..." << std::endl;
}
mock::~mock()
{
std::cout << "Starting destructor...";
free(this->test);
this->test = nullptr;
std::cout << "Address of test is " << this->test << std::endl;
std::cout << "Ending destructor..." << std::endl;
}
像这样在 main 中运行它:
auto some_mock = mock();
some_mock = mock();
some_mock = mock();
some_mock = mock(3);
预期结果:
Starting constructor...
Ending constructor...
Starting destructor...Address of test is 0
Ending destructor...
Starting constructor...
Ending constructor...
Starting destructor...Address of test is 0
Ending destructor...
Starting constructor...
Ending constructor...
Starting destructor...Address of test is 0
Ending destructor...
Starting full constructor...
Ending full constructor...
Starting destructor...Address of test is 0
Ending destructor...
Process returned 0
实际结果:
Starting constructor...
Ending constructor...
Starting constructor...
Ending constructor...
Starting destructor...Address of test is 0
Ending destructor...
Starting constructor...
Ending constructor...
Starting destructor...Address of test is 0
Ending destructor...
Starting full constructor...
Ending full constructor...
Starting destructor...Address of test is 0
Ending destructor...
*** Error in `/deploy/cmake-build-local-debug/CPP': double free or corruption (fasttop): 0x0000000002027c40 ***
.
.
.
Starting destructor...
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
这是有意为之的行为吗?如果是这样,为什么???我怎样才能解决这个问题(除了在重新分配之前使用新的和删除之外)?
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!