【问题标题】:Can anybody help me to do my own Vector class?有人可以帮我做我自己的 Vector 课吗?
【发布时间】:2017-05-07 14:53:24
【问题描述】:

我只有push_back函数有问题,编译器说:

CRT 检测到应用程序在堆缓冲区结束后写入内存

我想创建一个push_back function,在向量的末尾添加一个新元素。

#pragma once
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstdlib>

class tomb {
private:
    double *adat;
    int szam;
public:
    tomb(){
        adat = NULL;
        szam = 0;
    }
    int meret()const {
        return szam;
    }
    ~tomb() {
        delete[] adat;
    }
    double & operator[](int n) {
        return adat[n];
    }
    const double & operator[](int n)const {
        return adat[n];
    }
    void push_back(const double &a) {
        double *tmp;
        int pos = szam + 1;
        tmp = new double[szam+1];

        for (int i = 0; i < szam; i++)
        {
            tmp[i] = adat[i];
        }

        tmp[pos] = a;
        delete[] adat;
        adat = tmp;
        ++szam;
    }
    void Kiir()const {
        for (int i = 0; i < szam; i++)
        {
            std::cout << adat[i] << "\n";
        }
    }
};

【问题讨论】:

  • tmp[pos] = a 写入新分配块的最后一个位置——pos 那时是szam+1
  • 顺便说一句,你的班级违反了三原则。
  • 谢谢@G.M.回答:)
  • @aschepler 这是什么意思? :D 这是个大问题吗?
  • 至少你应该使用std::unique_ptr 来管理adat 的生命周期,而不是自己做。它还可以更轻松地更新您的代码以确保异常安全。

标签: c++ class object push-back


【解决方案1】:

pos 应该是 szam 而不是 szam+1。您愿意在最后一个位置插入,在从 0 开始的索引中是 n-1

【讨论】:

    【解决方案2】:

    问题出在这一行:

    tmp[pos] = a;
    

    由于pos被初始化为szam + 1,即等价于:

    tmp[szam + 1] = a;
    

    这是数组限制中的一个。

    解决方案是完全摆脱pos,然后这样做:

    tmp[szam] = a;
    

    顺便说一句,您的类正在使用默认的复制构造函数和赋值运算符,这些将无法正常工作。你真的应该为此做点什么。

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2017-06-12
      相关资源
      最近更新 更多