【发布时间】:2012-02-04 19:35:50
【问题描述】:
我有甲板和扑克牌课程。 Deck 对象必须有一个动态分配的指向 PlayingCard 对象的指针数组:
PlayingCard** _playing_cards;
为了初始化这个数组,Deck 的构造函数和 build() 函数被调用:
Deck::Deck(int size)
{
_total_playing_cards = size;
_deal_next = 0;
build();
}
void Deck::build()
{
_playing_cards = new PlayingCard*[_total_playing_cards];
for(int i = 1; i <= _total_playing_cards; ++i)
{
_playing_cards[i-1] = new PlayingCard(i % 13, i % 4);
}
}
释放用'new'分配的内存在析构函数中处理:
Deck::~Deck()
{
for(int i = 0; i < _total_playing_cards; ++i)
{
delete[] _playing_cards[i];
}
delete[] _playing_cards;
}
然后我有一个单独的文件,deck_test.cpp,它有一个 main() 来简单地构造和破坏一个 Deck 对象:
int main()
{
Deck deck(52);
deck.~Deck();
return 0;
}
这可以正常编译,但在调试时,Visual Studio 会报告“Playing Cards.exe 中 0x5ab159da (msvcr100d.dll) 处的未处理异常:0xC0000005:读取位置 0xfeeefee2 的访问冲突。”查看调用堆栈时,问题似乎发生在我在析构函数的“for”循环中使用“delete[]”运算符的地方。这不是从指针数组中释放内存的正确方法吗?
【问题讨论】:
-
在 for 循环中,不带 [] 的删除是否足够,因为您正在删除 _playing_cards[i] 指向的空间和对象?
标签: arrays pointers visual-c++ dynamic delete-operator