sách gpt4 ai đã đi

c++ - DynamicArray 抛出 OutOfBounds 异常

In lại 作者:行者123 更新时间:2023-11-30 04:41:01 29 4
mua khóa gpt4 Nike

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

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

假设我有一个全局变量

DynamicArray X;

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

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

下面是我的工作线程类

class ArrayModifierThread : public TThread
{
riêng tư:
DynamicArray __thread X;

protected:
void __fastcall Execute();

công cộng:
__fastcall ArrayModifierThread(bool CreateSuspended);
void setX(DynamicArray &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);

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

1 Câu trả lời

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

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

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

riêng tư:
DynamicArray& X;

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

ArrayModifierThread(DynamicArray& a): X(a) { ... }

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

riêng tư:
DynamicArray* X;
công cộng:
void setX(DynamicArray& 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
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com