5
|
John Zwinck · 技术社区 · 6 年前 |
![]() |
1
2
|
![]() |
2
2
1是未定义的行为吗? 对。永远不要使用realloc()复制对象,因为有时它们有指向资源的内部指针。当两个不同的对象运行它们的析构函数时,问题就出现了。现在一个双重解除分配发生在 相同的资源 ,完全没有。 2您能否建议一个可以应用于应用程序代码的修复或解决方法(不是通过更改Sparsehash或避免使用它)? 尝试
换行
到
现在,它不会使用谷歌的分配器
3. (加分)你能构造一个程序,它实际上会因为这个(使用std::string或你自己的非平凡类型)而出现错误吗?到目前为止,我还没有看到使用std::string作为键类型的代码中有任何问题,尽管std::string必须是非常常用的键类型。 不容易。因为你想引起不确定的行为。在您的测试程序中,我将输入长度至少为32个字符的字符串,因此小字符串优化不会启动。还有一些测试可以在gcc的堆中进行,以查看它是否已经损坏。看到了吗 1 |
![]() |
3
0
我想这段代码预期了c++20类属性 . 本质上,这是一个可以安全地更改内存位置的对象。用c++的说法,这是一个可以通过处理对象表示来安全复制的对象,只要复制的对象不再被访问,甚至不被销毁,程序就会保持预期的行为。 例如,该代码可能不会被C++ 20标准指定为“未定义行为”:
如果一个类型有一个引用其自身任何部分的非静态数据成员,则该类型不应具有普通的可重定位性:
|