我只对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";
}
}
};
答案 0 :(得分:0)
pos
应为szam
而不是szam+1
。您愿意在最后一个位置插入,该位置在基于0的索引中为n-1
。
答案 1 :(得分:0)
问题出在这一行:
tmp[pos] = a;
由于pos
已初始化为szam + 1
,因此相当于:
tmp[szam + 1] = a;
这是数组限制之一。
解决方案是完全摆脱pos
并且只做:
tmp[szam] = a;
BTW,您的类正在使用默认的复制构造函数和赋值运算符,这些将无法正常工作。你应该真的为此做些什么。