变量周围的堆栈在 c++ 中已损坏
Stack around the variable ' ' was corrupted in c++
i m当我尝试调用构造函数时会出现运行时错误,我认为我的内存删除不正确。这是我的构造者:
const int id_ferma;
int suprafata;
int nr_produse;
char* produse[];
Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[]) :id_ferma(id_ferma){
this->suprafata = suprafata;
this->nr_produse = nr_produse;
for (int i = 0; i < nr_produse; i++){
this->produse[i] = new char[strlen(produse[i]) + 1];
strcpy(this->produse[i], produse[i]);
cout << produse[i] << endl;
}
}
这是我的灾难:
~Ferma(){
for (int i = 0; i < nr_produse; i++){
if (this->produse[i] != NULL)
delete produse[i];
}
}
和main:
int main(){
char* produse1[] = { "Lapte oaie", "Branza vaca", "Muschi de porc", "Oua de gaina" };
for (int i = 0; i < 4; i++){
cout << produse1[i];
}
Ferma f1(14, 1500, 4, produse1);
}
在尝试填充它之前,您没有为this->produse
分配任何内存。另外,由于您正在手动管理动态分配的内存,因此您还需要手动实施三个规则。
而是尝试一下:
#include <algorithm>
class Ferma
{
private:
int m_id_ferma;
int m_suprafata
int m_nr_produse;
char** m_produse; // <-- change this to char**!
public:
Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[])
: m_id_ferma(id_ferma), m_suprafata(suprafata), m_nr_produse(nr_produse)
{
m_produse = new char*[nr_produse]; // <-- add this!
for (int i = 0; i < nr_produse; ++i)
{
m_produse[i] = new char[strlen(produse[i]) + 1];
strcpy(m_produse[i], produse[i]);
}
}
Ferma(const Ferma &src) // <-- add this!
: m_id_ferma(src.m_id_ferma), m_suprafata(src.m_suprafata), m_nr_produse(src.m_nr_produse)
{
m_produse = new char*[m_nr_produse];
for (int i = 0; i < m_nr_produse; ++i)
{
m_produse[i] = new char[strlen(src.m_produse[i]) + 1];
strcpy(m_produse[i], src.m_produse[i]);
}
}
~Ferma()
{
for (int i = 0; i < m_nr_produse; ++i)
delete[] m_produse[i]; // <-- change this to delete[]!
delete[] m_produse; // <-- add this!
}
Ferma& operator=(const Ferma &rhs) // <-- add this!
{
Ferma tmp(rhs);
std::swap(m_id_ferma, tmp.m_id_ferma);
std::swap(m_suprafata, tmp.m_suprafata);
std::swap(m_nr_produse, tmp.m_nr_produse);
std::swap(m_produse, tmp.m_produse);
return *this;
}
};
话虽如此,您应该停止使用手动内存管理。改用std::vector
和std::string
,让STL为您处理所有内存管理:
#include <vector>
#include <string>
class Ferma
{
private:
int m_id_ferma;
int m_suprafata;
std::vector<std::string> m_produse;
public:
Ferma(int id_ferma, int suprafata, int nr_produse, char* produse[])
: id_ferma(id_ferma), m_suprafata(suprafata)
{
m_produse.reserve(nr_produse);
for (int i = 0; i < nr_produse; ++i)
m_produse.push_back(produse[i]);
// alternatively:
// std::copy(produse, produse+nr_produse, std::back_inserter(m_produse));
}
// no destructor, copy constructor, or copy assignment operator needed!
};
您不是初始化produse
字段。
如果您想使用C 使用vector
而不是RAW数组,而string
代替char*
。
由于您用new[]
分配内存,因此您需要用delete[]
进行处理:
int *p = new int[10];
...
delete[] p;
int* p[1] = {new int[10]};
...
delete[] p[0];
和由于produse
是char **
,因此您应该在尝试解释之前为produse
分配内存:
char **produse = new char *[10];
produse[0] = new char [10];
...
delete[] produse[0];
delete[] produse;
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- AES-128 CFB-8解密的前16个字节已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 图像在本地主机上显示已损坏
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 串行端口的传入值有时已损坏或丢失
- 自定义异常中的消息已损坏