我们(显然)昨晚的Solaris MySQL数据库引擎执行得很糟糕.至少有一些InnoDB表已损坏,事务日志中的时间戳乱序错误,以及有关索引损坏的特定错误.
我们知道可用于MyISAM表修复的工具,但找不到InnoDB的任何内容.
附注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃.
根据n4296 C++标准文档:
[dcl.init.list](8.5.4.4)(第223-224页)
在braced-init-list的initializer-list中,initializer-clauses(包括pack扩展(14.5.3)产生的任何结果)按照它们出现的顺序进行评估.也就是说,与给定初始化子句相关联的每个值计算和副作用在每个值计算和副作用之前与在初始化列表的逗号分隔列表中跟随它之后的任何初始化子句相关联.[注意:无论初始化的语义如何,此评估顺序都保持不变; 例如,当initializer-list的元素被解释为构造函数调用的参数时,它适用,即使通常对调用的参数没有排序约束. - 尾注]
(强调我的)
该说明在此处添加:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1030
这告诉我以下代码:
#include <iostream>
struct MyType {
MyType(int i, int j, int k, int l)
: sum(i + j + k + l)
{
}
int sum;
};
int main()
{
int i = 0;
std::cout << MyType{ ++i, ++i, ++i, ++i }.sum << '\n';
}
Run Code Online (Sandbox Code Playgroud)
应打印"10".
这是我的理由:
也就是说,上面的代码应该与此代码完全相同:
#include <initializer_list>
#include <iostream>
int main()
{
int i = 0;
std::initializer_list<int> il{++i, ++i, …Run Code Online (Sandbox Code Playgroud) 在为Ruby开发SWIG包装的C++库时,我们在C++代码中的异常处理期间遇到了无法解释的崩溃.
我不确定重新创建问题的具体情况,但它在调用期间首先发生std::uncaught_exception,然后在一些代码更改后,__cxa_allocate_exception在异常构造期间移动到.GDB和valgrind都没有提供有关崩溃原因的任何见解.
我发现了几个类似问题的参考,包括:
最重要的主题似乎是情况的组合:
"解决方案"是将您的库与libstdc ++以及可能还与libGL明确地链接,从而强制链接的顺序.
在尝试使用我的代码进行多次组合之后,我找到的唯一解决方案就是LD_PRELOAD="libGL.so libstdc++.so.6" ruby scriptname选项.也就是说,编译时链接解决方案都没有任何区别.
我对该问题的理解是C++运行时未正确初始化.通过强制链接的顺序,您可以引导初始化过程并且它可以正常工作.只有C应用程序调用C++库时才会出现此问题,因为C应用程序本身并不链接到libstdc ++,并且没有初始化C++运行时.因为使用SWIG(或boost :: python)是从C应用程序调用C++库的常用方法,所以在研究问题时经常出现SWIG.
是否有人能够更深入地了解这个问题?是否存在实际解决方案或仅存在解决方法?
谢谢.