我想使用new运算符创建一个动态数组。
#include <iostream>
using namespace std;
class Set{
public:
Set() { count = 0; }
Set(int i) {
elements = new int;
elements[0] = i;
count = 1;
}
void add(int new_element) {
if(find(new_element) != -1) {
cout << "The set has " << new_element << " already.\n";
return;
}
else {
// elements[count] = new int;
elements[count++] = new_element;
cout << elements[count-1] << endl;
}
}
void remove(int remove_element) {
int index = find(remove_element);
if(index == -1) {
cout << "The set doesn't have " << remove_element << ".\n";
return;
}
else {
for(int i=index ; i<count ; i++)
elements[i] = elements[i+1];
count--;
}
}
void enumerate() {
for(int i=0 ; i<count ; i++)
cout << elements[i] << " ";
cout << endl;
}
~Set() {
}
private:
int* elements;
int count;
int find(int temp_element) {
int i=0;
for( ; i<count ; i++)
if(elements[i] == temp_element)
return i;
return -1;
}
};
int main() {
Set s1(1);
s1.add(2);
s1.add(3);
s1.remove(2);
s1.add(4);
s1.add(5);
s1.enumerate();
return 0;
我已经知道使用STL可以更轻松地解决这个问题。但是,我想知道为什么这个代码会出错。并且,我不知道为什么它在没有第18行的情况下工作。最后,我如何释放分配的存储空间?请让我知道答案。
答案 0 :(得分:0)
您将elements
声明为pointer to int
。这表明elements[i]
是一个普通的int
。通过写作
elements[count] = new int;
您尝试为其分配一些新分配的int指针。它不起作用,因为elements[count]
已经是int
而不是指针。
至于释放分配的存储空间,std::vector
只是跟踪它包含的元素数量,然后使用n
。然后,从data[0]
到data[n-1]
的所有内容都将成为您的实际信息。如果它最后有更多的存储空间,它只是将它留在那里而不需要取消分配它和一些垃圾值并且不允许你访问它。您可以通过使用新大小创建一个新数组,从旧存储复制每个元素,然后在旧指针上调用delete[]
来调整大小。注意可能的内存泄漏。