结构成员在访问时被清除
struct members gets cleared when accessed
首先,如果我的解释不好,我想道歉,英语不是我的第一语言。如果您不理解我在这里写的内容,我很乐意尝试更好地解释。
我正在尝试解决这个问题。我有一个结构数组(工作坊(,它是另一个结构(Available_Workshops(的成员。我的问题是数组中 Workshop 结构的所有实例的所有数据成员在CalculateMaxWorkshops
函数中的 for 循环第一次迭代后被清除,从而导致第一次循环后出现分段错误。我尝试使用向量和动态数组,但问题仍然存在。
这是我的代码。
#include <iostream>
using namespace std;
struct Workshop
{
int start = 0;
int dur = 0;
int end = 0;
};
struct Available_Workshops
{
int n = 0;
Workshop *arr = new Workshop[n];
};
Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
aw.n = n;
for (int i = 0 ; i < n ; i++)
{
Workshop w;
w.start = s[i];
w.dur = d[i];
w.end = w.start + w.end;
cout << w.end;
aw.arr[i] = w;
}
u = &aw;
return u;
};
int CalculateMaxWorkshops(Available_Workshops *time_table)
{
int n = time_table-> n, //number of workshop objects
int current_class, next_class=0;
int max_classes = 0;
for (int i = 0 ; i < n-1 ; i++)
{
Workshop cur = time_table -> arr[i];
current_class = cur.end; //all struct members gets cleared for some reason after this line
}
}
我只能编辑上面的内容,下面的代码被锁定在站点编辑器中。
int main() {
int n; // number of workshops
cin >> n;
// create arrays of unknown size n
int* start_time = new int[n];
int* duration = new int[n];
for(int i=0; i < n; i++){
cin >> start_time[i];
}
for(int i = 0; i < n; i++){
cin >> duration[i];
}
Available_Workshops * ptr;
ptr = initialize(start_time,duration, n);
cout << CalculateMaxWorkshops(ptr) << endl;
return 0;
}
我在CalculateMaxWorkshops
函数中尝试了不同的方法,它导致了不同的问题。
int CalculateMaxWorkshops(Available_Workshops *time_table)
{
int n = time_table -> n, //number of workshop objects
int current_class, next_class=0;
int max_classes = 0;
for (int i = 0 ; i < n-1 ; i++)
{
Workshop *cur = &(time_table -> arr[i]);
current_class = cur -> end;
}
}
这次的问题是数组向后"偏移"。换句话说,存储在 arr[i] 中的数据将存储在 arr[i-1] 中,而存储在 arr[n-i-1] 中的数据将重新初始化。
总之,第一个问题是数据正在变为 NULL,而第二个问题是数据正在向后偏移并重新初始化,例如start = -17891602
。
在此函数中,您将返回一个存储局部变量地址的指针:
Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
// ...
u = &aw;
return u;
};
取消引用此函数返回的指针将调用未定义的行为。
您需要为此指针分配内存:
Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops aw;
Available_Workshops *u;
// ...
u = new Available_Workshops{aw};
return u;
};
然后记得以后delete
这段记忆。
一般来说,我建议使用std::unique_ptr
,或者最好完全避免指针。但是,由于您无法更改main
,这不是您的选择。
除了 cigien 指出的问题,你在这里还有另一个问题
struct Available_Workshops
{
int n = 0;
Workshop *arr = new Workshop[n];
};
arr
是指向零长度数组的指针(因为n
为零(。但在这里
for (int i = 0 ; i < n ; i++)
{
...
aw.arr[i] = w;
}
你把它当作一个长度n
.您需要为足够的研讨会分配内存。执行此操作的简单方法是在构造函数中
struct Available_Workshops
{
Available_Workshops(int num) : n(num), arr(new Workshop[num]) {}
int n;
Workshop *arr;
};
然后你可以像这样使用
Available_Workshops* initialize(int s[], int d[], int n)
{
Available_Workshops *u = new Available_Workshops(n);
for (int i = 0 ; i < n ; i++)
{
Workshop w;
w.start = s[i];
w.dur = d[i];
w.end = w.start + w.end;
cout << w.end;
u->arr[i] = w;
}
return u;
};
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 结构成员在访问时被清除
- 清除同一属性后,设置属性时拒绝访问
- visual studio 2010-C++清除的内存仍然可以访问
- 为什么清除后我仍然可以访问数据向量