gpt4 book ai didi

c++ - DynamicArray 抛出 OutOfBounds 异常

转载 作者:行者123 更新时间:2023-11-30 04:41:01 29 4
gpt4 key购买 nike

我知道这听起来可能很奇怪,但是是的,现在是 2009 年,我需要使用 BCB5 编写小型应用程序 :)

问题是 DynamicArray 在尝试从工作线程内扩展它时抛出 OutOfBound 异常。

假设我有一个全局变量

DynamicArray<double> X;

在主线程中,我检查数组的长度,结果为 0,这没问题(长度未设置)

Application->MessageBox(itoa(X.Length,str , 10), "", MB_OK);

下面是我的工作线程类

class ArrayModifierThread : public TThread
{
private:
DynamicArray<double> __thread X;

protected:
void __fastcall Execute();

public:
__fastcall ArrayModifierThread(bool CreateSuspended);
void setX(DynamicArray<double> &a);
};

到目前为止一切顺利。接下来我创建新线程:

ArrayModifierThread *t = new ArrayModifierThread(true);
t->setX(X); // Pass reference to my global DynamicArray
t->Resume();

此处执行 Execute() 方法:

void __fastcall ArrayModifierThread::Execute()
{
X.Length = 10;
X[5] = 45.5;
}

我期望的是全局数组被扩展并且第 6 个元素的值为 45.5。

但从主线程内部进行更仔细的调查会发现 Length = 0 和 ArrayOfBounds 异常:

 Application->MessageBox(itoa(__X.Length,str , 10), "", MB_OK);
Application->MessageBox(itoa(__X[5],str , 10), "", MB_OK);

谁能告诉我我错过了什么?

最佳答案

在您的Execute 方法中,您正在修改线程的 X 字段,而不是全局X 变量。尽管 setX 方法通过引用接收其参数,但成员变量不是引用。它存储 DynamicArray 值的拷贝,并且更改 Length 属性可确保它引用唯一数组。

setX 函数接收对全局变量的引用,正如您在“答案”中正确观察到的那样,但它不会保留 对它的引用。当它分配对象的 X 字段时,它会创建一个拷贝。

也许您还打算将 X 声明为引用:

private:
DynamicArray<double>& X;

那行得通。您的 setX 函数将不再起作用,因为您不允许在初始化后“重新安置”引用。相反,您需要在线程的构造函数中对其进行初始化:

ArrayModifierThread(DynamicArray<double>& a): X(a) { ... }

您还可以将指针存储到数组而不是引用:

private:
DynamicArray<double>* X;
public:
void setX(DynamicArray<double>& a) {
X = &a;
}
protected:
void Execute() {
X->Length = 10;
(*X)[5] = 45.5;
}

您还需要注意的是您的代码不是线程安全的。 (这里也不是我的。)您有多个线程在没有任何保护的情况下修改同一个共享资源(数组),例如关键部分。不过,这超出了这个问题的范围。首先搜索 Stack Overflow 和 Web 的其余部分,然后如果您需要有关该问题的帮助,然后回来提出新问题

关于c++ - DynamicArray 抛出 OutOfBounds 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506240/

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