变量周围的堆栈在 c++ 中已损坏

Stack around the variable ' ' was corrupted in c++

本文关键字:c++ 已损坏 堆栈 周围 变量      更新时间:2023-10-16

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::vectorstd::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];

和由于produsechar **,因此您应该在尝试解释之前为produse分配内存:

char **produse = new char *[10];
produse[0] = new char [10];
...
delete[] produse[0];
delete[] produse;