gpt4 book ai didi

c++ - 在构造函数中使用 std::vector 损坏内存

转载 作者:行者123 更新时间:2023-11-28 06:24:18 24 4
gpt4 key购买 nike

给定一个字符串数组,我正在编写一个类,根据它们的长度将它们分成不同的组,即相同长度的进入同一组。组数和每个组的大小未知。

我的想法如下:我使用私有(private)数据成员 std::vector<std::vector<std::int> > m_groups ,目的是外部 vector 维护组,内部 vector 跟踪属于一个组的所有字符串索引。

问题是,一旦我将字符串放入 vector 中,我的一些数据成员就会损坏。有人可以看看吗?

这是简化的代码:

class A {

public:
A(std::string words[], int num, int c1[], int m, int c2[], int n);
~A();

void print_state();

private:

int *m_var;
int m_Nvar;

std::vector<std::vector<std::int> > m_doms;
std::vector<std::vector<std::int> > m_groups;
std::vector<std::string> > m_words;

int *m_cst1;
int *m_cst2;
int m_Ncst;
};

在构造函数中: A::print_cst2() { for (int c = 0; c < m_Ncst; c++) { printf("%d", m_cst2[4*c]); printf("%d", m_cst2[4*c+1]); printf("%d", m_cst2[4*c+2]); printf("%d", m_cst2[4*c+3]); }

A::A(std::string words[], int num,
int c1[], int m, int c2[], int n) {

...
m_cst1 = new int[m/2];
m_cst2 = new int[n/4];
m_Ncst = n/4;
m_Nvar = m/2;

for (int i = 0; i < n; i+=4)
{
m_cst2[i] = c2[i];
m_cst2[i+1] = c2[i+1];
m_cst2[i+2] = c2[i+2];
m_cst2[i+3] = c2[i+3];
}

print_cst2(); // (1) we print the m_cst2
// we are only interested, the words of length smaller than m_max_len
// put m_max_len number of empty vectors (groups) in the group vector
for (int i = 0; i < m_max_len; i++)
{
m_groups.push_back(std::vector<int>());
}
print_cst2(); // (2) we print the m_cst2 again

// go through every words and copy words of interest to m_words
// push the index of the word to the group it belongs to (by its length)
for (int i = 0, k = 0; i < num; i++, k++)
{
int len = words[i].length();
if (len > m_max_len)
continue;
m_words.push_back(words[i]);
m_groups[len].push_back(k);
}

// you can ignore this part: link the group to another structure
for (int i = 0; i < m_Nvar; i++)
{
m_doms.push_back(m_groups[m_cst1[i]]);
}

...
}

...

我编译了代码并运行了。数组末尾的数据m_cst2被损坏。这似乎与 std::vector 的使用有关. User comingstorm provided an interesting clue : 外层 std::vector存储一个固定大小的数组 std::vector<int>堆分配中的数据结构。 这就是答案吗?虽然不确定。所以,发布这个并征求建议。

PS:如果你有更好的想法来完成这个任务,请告诉我......如果你需要更多信息,请发帖。

非常感谢您的宝贵时间。

最佳答案

下面的一些改进。特别是你有一个 off by 1 索引错误并且 k 的增量不正确:

CwordSolver::CwordSolver(std::string words[], int num,
int c1[], int m, int c2[], int n) {

...

// we are only interested, the words of length smaller than m_max_len
m_groups.resize(0);
m_groups.resize(m_max_len, std::vector<int>());

// go through every words and copy words of interest to m_words
// push the index of the word to the group it belongs to (by its length)
int k = 0; // the index in m_words
for (int i = 0; i < num; i++)
{
int len = words[i].length();
if (len >= m_max_len)
continue;
m_words.push_back(words[i]);
m_groups[len].push_back(k);
k++;
}

...
}

关于c++ - 在构造函数中使用 std::vector 损坏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28795968/

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