在构造函数中使用std::vector导致内存损坏
memory corrupted using std::vector in constructor
给定一个字符串数组,我正在编写一个类,根据它们的长度将它们分为不同的组,即相同长度的字符串属于同一组。组的数量和每个组的大小都是未知的。
我的想法如下:我使用私有数据成员std::vector<std::vector<std::int> > m_groups
,目的是外部向量维护组,内部向量跟踪属于一个组的字符串的所有索引。
问题是,一旦我将字符串推入向量,我的一些数据成员就会被破坏。有人能看一下吗?
这是简化的代码:
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]]);
}
...
}
...
我编译了代码并运行。数组 PS:如果你有更好的想法来完成这项任务,请告诉我。。。如果您需要更多信息,请发帖。 我很感激你抽出时间。m_cst2
末尾的数据已损坏。这似乎与std::vector
的使用有关。用户表单提供了一条有趣的线索:外部std::vector
在其堆分配中存储了一个固定大小的std::vector<int>
数据结构数组
下面的一些改进。特别是,您有一个偏离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++;
}
...
}
如果您发布的代码是您正在使用的实际代码,那么这将损坏内存。
假设n
为4。
m_cst2 = new int[n/4]; // so you have room for 1 item
m_Ncst = n/4;
m_Nvar = m/2;
for (int i = 0; i < n; i+=4)
{
m_cst2[i] = c2[i]; // valid
m_cst2[i+1] = c2[i+1]; // memory overwrite
m_cst2[i+2] = c2[i+2]; // memory overwrite
m_cst2[i+3] = c2[i+3]; // memory overwrite
}
没有必要更进一步。n
的值是4,当您向m_cst2[1], m_cst2[2]
等写入时,很明显您将在m_cst2
中越界,因为唯一有效的条目是m_cst2[0]
。
因此,内存损坏可能与std::vector
无关(很难弄乱对象的向量),它很可能与上面的代码有关。
此外,您应该在代码中使用std::vector
而不是new[]/delete[]
。如果你打算使用vector
做一件事,为什么不随时随地利用它呢?
- 当vector是tje全局变量时,c++中vector的内存管理
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使 std::vector 分配对齐内存的现代方法
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- C++ 中 std::vector 的内存问题
- vector是否为std::移动的对象连续分配内存
- 释放 std::vector 中指针内存的最有效方法是什么?
- 如何让 'std::vector' <int32_t>从 'std::vector&&' 中获取内存<uint32_t>?
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 如何使用 std::vector 防止内存重新分配
- 让 'std::vector<unsigned char>' 从 'std::string' 中窃取内存
- 将 std::vector<int> 从原始内存转换为数组
- 给出一个 std::vector 对另一个向量的内存的所有权?
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 内存覆盖在我自己的 Vector 类中
- 释放 std::vector 中的内存
- 删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误
- vector内存操作中的安全性