new int []引发“访问冲突”异常
|
我一直在研究自定义Vector类。一切在Microsoft编译器上都可以正常运行,但是当我在Borland上尝试时,我遇到了一个非常奇怪的错误。
Borland在insert函数中引发异常;
正是在调用复制构造函数\“ Vector temp(* this); \”时
\“ array_ = new int [rhs.size _]; \”行
void Vector::insert(int value, unsigned position) throw(SubscriptError)
{
check_bounds(position);
Vector temp(*this);
int tmpSize= size_;
temp.size_++;
size_++;
for (unsigned int i=tmpSize; i > position; i--)
{
temp[i] = temp[i-1];
}
temp[position] = value;
//array_= temp.array_;
for(unsigned int i = 0; i < size_; i++)
{
array_[i]= temp.array_[i];
}
}
这是我的复制构造函数;
Vector::Vector(const Vector& rhs)
{
array_ = new int[rhs.size_];
size_ = rhs.size_;
for(unsigned int i = 0; i < rhs.size_; i++)
{
array_[i] = rhs.array_[i];
}
}
最后是main();
std::cout << \"push_back 5 integers:\\n\";
for (int i = 0; i < 5; i++)
{
a.push_back(i);
Print(a);
}
std::cout << \"insert(99, 3):\\n\";
a.insert(99, 3);
Print(a);
std::cout << \"insert(98, 0):\\n\";
a.insert(98, 0);
Print(a);
std::cout << \"insert(97, 6):\\n\";
a.insert(97, 6);
Print(a);
奇怪的是,第一个插入调用(a.insert(99,3))正常工作,第二个调用(a.insert(98,0))崩溃
这是完整的头文件
namespace CS170
{
class SubscriptError
{
public:
SubscriptError(int Subscript) : subscript_(Subscript) {};
int GetSubscript(void) const { return subscript_; }
private:
int subscript_;
};
class Vector
{
public:
static const int NO_INDEX = -1;
struct SortResult
{
unsigned compares;
unsigned swaps;
};
// Default constructor
Vector(void);
// Destructor
~Vector();
// Copy constructor
Vector(const Vector& rhs);
// Constructor to create a Vector from an array
Vector(const int array[], unsigned size);
// Adds a node to the front of the list
void push_back(int value);
// Adds a node to the end of the list
void push_front(int value);
// Removes the last element. Does nothing if empty.
void pop_back(void);
// Removes the first element. Does nothing if empty.
void pop_front(void);
// Inserts a new node at the specified position. Causes an
// abort() if the position is invalid. (Calls check_bounds)
void insert(int value, unsigned position) throw(SubscriptError);
// Removes an element with the specified value (first occurrence)
void remove(int value);
// Deletes the underlying array and sets size_ to 0
void clear(void);
// Return true if the vector is empty, otherwise, false
bool empty(void) const;
// Assignment operator
Vector& operator=(const Vector& rhs);
// Concatenates a vector onto the end of this vector.
Vector& operator+=(const Vector& rhs);
// Concatenates two Vectors.
Vector operator+(const Vector& rhs) const;
// Subscript operators.
int operator[](unsigned index) const throw(SubscriptError);
int& operator[](unsigned index) throw(SubscriptError);
// Returns the number of elements in the vector.
unsigned size(void) const;
// Returns the size of the underlying array
unsigned capacity(void) const;
// The number of memory allocations that have occurred
unsigned allocations(void) const;
// This searches the vector using a binary search instead
// of a linear search. The data must be sorted. Returns
// the index. If not found, returns CS170::Vector::NO_INDEX.
// DO NOT SORT THE DATA IN THIS FUNCTION!!
int bsearch(int value) const;
// Sorts the elements using a selection sort.
// Returns the number of swaps/comparisons that occurred.
SortResult selection_sort(void);
// Sorts the elements using a bubble_sort.
// Returns the number of swaps/comparisons that occurred.
SortResult bubble_sort(void);
void swap(int &a, int& b);
void swapv(Vector &other);
void reverse(void);
bool operator==(const Vector& rhs) const;
void shrink_to_fit(void);
private:
int *array_; // The dynamically allocated array
unsigned size_; // The number of elements in the array
unsigned capacity_; // The allocated size of the array
unsigned allocs_; // Number of allocations (resizes)
// Private methods...
void check_bounds(unsigned index) const throw(SubscriptError);
void grow(void);
// Other private methods...
};
}// namespace CS170
#endif // VECTOR_H
没有找到相关结果
已邀请:
3 个回复
场竟矩喘崩
中调整
的大小。这意味着您将始终在其分配的内存末尾写入一个元素。 复制整个数组(两次)会导致非常昂贵的插入。您要达到什么目的才能达到ѭ6不能完成的目标?
净爽
中发生了以下情况:
调用后,首先插入您的堆栈将已损坏。所以第二次崩溃了。只需验证相应的代码更改即可。 在旁注, 我觉得你可以写
,更优化。我觉得不需要暂时复制完整的14英镑。 另外,尝试分配给
的字节数要多于实际需要。这样您就不必多次重新分配 尝试从STL中查看实际ѭ16的源代码,以提高效率。
驮帽俺篮号