我正试图在c ++中找出基于数组的队列的实现。此时我只是尝试初始化一个大小取决于用户输入的数组。我有一个Queue类如下:
Queue.h: #include
using namespace std;
class Queue {
private:
int *ptrtoArray;
int arraysize;
int data;
public:
Queue(int size);
Queue();
void print();
};
Queue.cpp:
#include "Queue.h"
Queue::Queue() {
}
Queue::Queue(int size) {
int theQueue[size];
arraysize = size;
ptrtoArray = &theQueue[0];
for (int i=0;i<size;i++) {
theQueue[i] = -1;
}
cout << "(";
for(int i=0;i<size;i++) {
cout << ptrtoArray[i] << ",";
}
cout << ")" << endl;
}
void Queue::print() {
cout << "(";
for(int i=0;i<arraysize;i++) {
cout << ptrtoArray[i] << ",";
}
cout << ")" << endl;
}
main.cpp中:
#include <iostream>
#include "Queue.h"
using namespace std;
const string prompt = "queue> "; // store prompt
Queue *queue;
void options(){
string input; // store command entered by user
cout << prompt; // print prompt
cin >> input; // read in command entered by user
int queuesize,num;
while(input != "quit") { // repeat loop as long as user does not enter quit
if (input == "new") { // user entered ad
cin >> queuesize;
queue = new Queue(queuesize);
} else if (input == "enqueue"){ //user entered remove
} else if (input == "dequeue"){ //user entered remove
} else if (input == "print"){ //user entered quit
queue->print();
} else { // no valid command has been selected
cout << "Error! Enter add, remove, print or quit." << endl;
}
cout << prompt; // repeat prompt
cin >> input; // read new input
}
}//options
/**
* Main function of the program. Calls "options", which handles I/O.
*/
int main() {
options();
return 0;
}
执行代码时,构造函数中的代码一切正常,但print函数会产生一些奇怪的结果。
queue> new 5
(-1,-1,-1,-1,-1,)
queue> print
(134516760,134525184,-1081449960,4717630,134525184,)
queue>
所以,此时我只想让print()函数向我展示数组在每个元素中只包含-1。我对指针的了解非常有限,所以如果你能帮助我意识到我做错了什么就会很棒!
答案 0 :(得分:3)
你在本地范围内声明你的数组,然后在它超出范围时丢失它,但是指针仍然指向它在内存中的地址,谁知道它会变成什么,就像你发现的那样。尝试:
ptrToArray = (int *) malloc(sizeof(int) * size);
或new
关键字:
ptrToArray = new int[size];
答案 1 :(得分:2)
int theQueue[size];
arraysize = size;
ptrtoArray = &theQueue[0];
分配静态数组theQueue
,它将在构造函数返回时释放。
您应该使用new
arraysize = size;
ptrtoArray = new int[size];
不要忘记在析构函数中删除它(如果你不再需要它,则更早)。
修改强>
<强>静态强>
int theQueue[size];
将在堆栈上分配。这意味着当您的函数(声明所在的位置)返回时,内存不再可访问。例如,它可以被下一个函数用于保存另一个数组。
优势更快,您无需明确释放它,以避免泄漏。
动态
ptrtoArray = new int[size];
在堆上分配。这意味着即使你超出范围,它仍将由你拥有(除非你失去指向它的指针。在这种情况下你注定要失败)。如果您不再需要它,可以使用
释放它delete[] ptrtoArray;
优势可以具有动态尺寸。可用范围超出范围。
答案 2 :(得分:0)
实际上是预期的。请参阅ptrtoArray
class Queue
成员指向函数范围变量,该变量在程序的整个生命周期内都不可用。在这里,这是你的构造函数。所以ptrtoArray
将指向一个完全随机的内存位置,即它被称为“狂野指针”
请参阅:https://stackoverflow.com/a/11137525/1919302,以便更好地了解变量的范围和生命周期之间的差异以及输出的原因。