我正在调查我们计划中的崩溃。我正在看另一个程序员编写的QSort。我想讨论为什么这对他们来说不安全,但他们对C ++的技术理解比我更好,并希望获得尽可能多的信息。我无法粘贴实际代码,但我会尽力重新创建必需品。
我可以想到为什么这是不安全的几个原因,但想要更具体的谈话要点。
QSort在两个具有不同结构的数组上运行,第一个元素是另一个名为MyString的结构。否则结构的其他元素是不同的。例如:
struct SItemA
{
MyString ItemId;
INT IntFoo;
}
struct SItemB
{
MyString ItemId;
FLOAT FloatFoo;
}
这是一个性能关键应用程序,因此不使用STL字符串/数组。我不知道如何实现字符串/数组的细节,但它们是可靠的,并且受到更大社区的测试,并且不是我怀疑的焦点。
static int
IDCompare(
void const* inA,
void const* inB)
{
MyString const* a = (MyString const*)inA;
MyString const* b = (MyString const*)inB;
return MyStrCmp(**a, **b);
}
appQsort(aItems.GetData(), aItems.Num(), sizeof(SItemA), IDCompare);
appQsort(bItems.GetData(), bItems.Num(), sizeof(SItemB), IDCompare);
QSort天真地假设结构的地址与MyString元素的地址相同。据我所知,这是正确的(现在),因为C ++编译器保证结构元素按顺序存储(只要结构符合POD的标准,就我所知道的那样)。< / p>
我认为这是用这种方式编写的,以避免为每个结构编写两个不同版本的QSort。
我的主要观点是,如果结构的实现发生变化(字符串被(重新)/移动),程序将以不可预测的方式运行,甚至可能导致内存违规。
假设结构定义没有改变。 QSort是否还有其他问题?