【发布时间】: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