如何修复 'std::bad_alloc'
How to fix 'std::bad_alloc'
我必须从文件 100 中读取不同类型的任务,以便对队列执行不同的操作,并在输出文件上打印。
但是我得到 "terminate called after throwing an instance of 'std::bad_alloc' "
作为错误
我认为是模板声明中的内容。
我试图以不同的方式声明它,但似乎不起作用。
如果有人能帮助我,我将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"
using namespace std;
template <typename T> class Pila
{
private:
bool empty=1;
public:
int lunghezza;
int cima;
T * Tab;
Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
void Push(T L){
cima--;
Tab[cima]=L;
}
void Pop(){
if(!empty)
cima++;
if(cima=lunghezza) empty=1;
}
bool Empty(){
if(empty==1) return 1;
else return 0;
}
T top(){
return Tab[cima];
}
void Print(){
for(int i=lunghezza-1; i>=cima; i--) cout<< Tab[i]<< " ";
}
};
template <typename V> class Queue
{
public:
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
void enqueue(V L){ //sposta tutti gli elementi da A a B
while(!A.Empty()){
B.Push(A.top());
A.Pop();
}
A.Push(L); //Mette L dentro A
while(!B.Empty()){ //sposta tutto di nuovo dentro A
A.Push(B.top());
B.Pop();
}
}
void dequeue(){
if(A.Empty()){
cout<< " Coda Vuota"<< endl;
}
else
A.Pop();
}
void Stampa(){
A.Print();
cout<< endl;
}
};
int main(){
fstream infile, outfile;
infile.open(INPUT_FILE, fstream::in);
outfile.open(OUTPUT_FILE, fstream::out);
int c=0, N,tmp;
string tipo,operazione;
while(c<100){
infile>> tipo;
infile>> N;
if(tipo=="int"){
Queue<int> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
int elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="double"){
Queue<double> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
double elem=stod(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="bool"){
Queue<bool> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
bool elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="char"){
Queue<char> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
char elem=(char)(operazione[1]);
A.enqueue(elem);
}
}
A.Stampa();
}
c++;
}
}
你的第一个问题是你的初始化。
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
A
和 B
将使用尚未初始化的 lunghezza
的值进行初始化。这样你可以获得非常高的值,分配大量内存。
这部分更好的实现是使用初始化器
int lunghezza;
Queue(int l) : lunghezza(l), A(l), B(l)
{
}
Pila<V> A;
Pila<V> B;
你的第二个问题在Pila
class.
Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
在此代码中,Tab 永远不会被取消分配,因此当您的对象被销毁时,您将泄漏(松散)分配的内存。您必须在析构函数中调用 delete[] Tab;
。
您还可以使用 STL class 等 std::list
或 std::vector
来替换您的 class Pila
.
我必须从文件 100 中读取不同类型的任务,以便对队列执行不同的操作,并在输出文件上打印。 但是我得到 "terminate called after throwing an instance of 'std::bad_alloc' " 作为错误 我认为是模板声明中的内容。 我试图以不同的方式声明它,但似乎不起作用。 如果有人能帮助我,我将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"
using namespace std;
template <typename T> class Pila
{
private:
bool empty=1;
public:
int lunghezza;
int cima;
T * Tab;
Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
void Push(T L){
cima--;
Tab[cima]=L;
}
void Pop(){
if(!empty)
cima++;
if(cima=lunghezza) empty=1;
}
bool Empty(){
if(empty==1) return 1;
else return 0;
}
T top(){
return Tab[cima];
}
void Print(){
for(int i=lunghezza-1; i>=cima; i--) cout<< Tab[i]<< " ";
}
};
template <typename V> class Queue
{
public:
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
void enqueue(V L){ //sposta tutti gli elementi da A a B
while(!A.Empty()){
B.Push(A.top());
A.Pop();
}
A.Push(L); //Mette L dentro A
while(!B.Empty()){ //sposta tutto di nuovo dentro A
A.Push(B.top());
B.Pop();
}
}
void dequeue(){
if(A.Empty()){
cout<< " Coda Vuota"<< endl;
}
else
A.Pop();
}
void Stampa(){
A.Print();
cout<< endl;
}
};
int main(){
fstream infile, outfile;
infile.open(INPUT_FILE, fstream::in);
outfile.open(OUTPUT_FILE, fstream::out);
int c=0, N,tmp;
string tipo,operazione;
while(c<100){
infile>> tipo;
infile>> N;
if(tipo=="int"){
Queue<int> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
int elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="double"){
Queue<double> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
double elem=stod(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="bool"){
Queue<bool> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
bool elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="char"){
Queue<char> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
char elem=(char)(operazione[1]);
A.enqueue(elem);
}
}
A.Stampa();
}
c++;
}
}
你的第一个问题是你的初始化。
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
A
和 B
将使用尚未初始化的 lunghezza
的值进行初始化。这样你可以获得非常高的值,分配大量内存。
这部分更好的实现是使用初始化器
int lunghezza;
Queue(int l) : lunghezza(l), A(l), B(l)
{
}
Pila<V> A;
Pila<V> B;
你的第二个问题在Pila
class.
Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
在此代码中,Tab 永远不会被取消分配,因此当您的对象被销毁时,您将泄漏(松散)分配的内存。您必须在析构函数中调用 delete[] Tab;
。
您还可以使用 STL class 等 std::list
或 std::vector
来替换您的 class Pila
.