奇怪的拷贝构造函数和析构函数错误

问题描述 投票:0回答:2

我有一个课,但我不断从析构函数中得到一些错误。这是分类:

#pragma once
class Number
{
    int bas;
    char* val;
public:
    Number(const char* value, int base); 
    Number(const Number& x);
    ~Number();
    void SwitchBase(int newBase);
    void Print();
    int  GetDigitsCount();
    int  GetBase(); 
};

这是cpp文件:

#include "Number.h"
#include <iostream>
Number::Number(const char* value, int base)
{
    int a = -1;
    do
    {
        a++;
    } while (value[a] != '\0');
    val = new char[a + 1];
    for (int i = 0; i <= a; i++)
        val[i] = value[i];
    bas = base;
}

Number::Number(const Number& x)
{
    int a = -1;
    bas = x.bas;
    do
    {
        a++;
    } while (x.val[a] != '\0');
    delete[]val;
    val = new char[a + 1];
    int i;
    for (i = 0; i <= a; i++)
        val[i] = x.val[i];
}
Number::~Number()
{
    delete[]val;
}
void Number::Print()
{
    std::cout << "Numarul este: " << val<< std::endl << "Baza este: " << bas<<std::endl;
}
int Number:: GetDigitsCount()
{
    int l = 0;
    do
    {
        l++;
    } while (val[l] != '\0');
    return l;
}

这是主要的:

int main()
{
    Number x("123", 10),y("111",10),z("0",10);
    z = y;
    z.Print();
}

我一直收到此错误:指定给RtlValidateHeap(010C0000,010C8DD8)的地址无效如果我在主要方面进行了此更改,则它可以正常工作,但实际上不是我想要的...

int main()
{
    Number x("123", 10),y("111",10);
    Number z = y;
    z.Print();
}

我该如何解决?我不知道...

c++ class destructor copy-constructor
2个回答
2
投票

您的Number类缺少赋值运算符。因为您在main中使用了赋值运算符,所以当您退出main时,默认的赋值运算符将导致两次删除,这解释了错误。

这也解释了为什么在将main更改为使用复制构造函数而不是赋值运算符时错误消失了。

您应该查看copy and swap习惯用法,以显示如何轻松有效地实现复制构造函数和赋值运算符。

或者,您也可以使用std::string代替手动分配内存。这样就无需编写析构函数,复制构造函数和赋值运算符。那是最好的解决方案。


2
投票

这是使用std :: string:]的代码外观示例。

#include <iostream>
#include <string>

class Number
{
    int bas;
    std::string val;
public:
    Number(std::string, int base); 
    Number(const Number& number);
    Number& operator= (const Number& number);
    ~Number()=default;
    void Print();
    int  GetDigitsCount();
};


Number::Number(std::string value, int base)
{
    val=value;
    bas=base;
}

Number::Number(const Number& number)
{
    val=number.val;
    bas=number.bas;
}

Number& Number::operator= (const Number& number)
{
    val=number.val;
    bas=number.bas;
    return *this;
}

void Number::Print()
{
    std::cout << "Numarul este: " << val<< std::endl << "Baza este: " << bas<<std::endl;
}
int Number:: GetDigitsCount()
{
    return val.size();
}

int main()
{
    Number x("123", 10),y("111",10),z("0",10);
    Number k(y);
    k.Print();
}
    
© www.soinside.com 2019 - 2024. All rights reserved.