C++;删除时应用程序崩溃 我有一个相当复杂的应用程序,用C++编写。我有一个名为订购本的类。我需要动态创建OrderBook对象数组,所以我所做的是 OrderBook* pOrderBooks; // In header file

C++;删除时应用程序崩溃 我有一个相当复杂的应用程序,用C++编写。我有一个名为订购本的类。我需要动态创建OrderBook对象数组,所以我所做的是 OrderBook* pOrderBooks; // In header file,c++,arrays,new-operator,C++,Arrays,New Operator,在运行时,我创建数组作为 p_OrderBooks = new OrderBook[n]; // n is an integer initialized at run time 程序运行良好。但是当我试图删除数组时(因为我需要创建一个由pOrderBooks指向的新数组),程序崩溃了。这就是我删除它的方式 delete[] p_OrderBooks; 我已经确定坠机事件的发生正是由于那条线。因此,我目前正在做的是重新初始化指针,而不删除以前分配的内存 //delete[] p_OrderBo

在运行时,我创建数组作为

p_OrderBooks = new OrderBook[n]; // n is an integer initialized at run time
程序运行良好。但是当我试图删除数组时(因为我需要创建一个由
pOrderBooks
指向的新数组),程序崩溃了。这就是我删除它的方式

delete[] p_OrderBooks;
我已经确定坠机事件的发生正是由于那条线。因此,我目前正在做的是重新初始化指针,而不删除以前分配的内存

//delete[] p_OrderBooks; // <- crash happens here
p_OrderBooks = new OrderBook[k]; // for some 'k'

//删除[]采购订单;// 您正在分配
p\u订单簿
,但正在删除
p\u订单簿


如果这只是您的帖子中的一个简单输入错误,那么很可能是您超出了此数组的界限,写入了超过开头或结尾的元素,因此损坏了堆,因此当您尝试删除它时它会崩溃。

您正在分配
p\u医嘱簿
,但正在删除
pOrderBooks

delete[] p_OrderBooks;

如果这只是你文章中的一个简单的输入错误,那么很可能是你超出了这个数组的范围,写的元素超过了开头或结尾,因此,会损坏堆,使其在尝试删除时崩溃。

是否有可能是OrderBook的一个或多个析构函数正在从析构函数中抛出异常?如果是()且未处理,将使应用程序崩溃。

是否有可能一个或多个OrderBook析构函数正在从析构函数中抛出异常?如果是()且未处理,则会使应用程序崩溃。

如果您正在执行以下操作:

delete[] p_OrderBooks;
订单簿*p_订单簿

int n

p_OrderBooks=新订单簿[n];//这里n包含垃圾

中国

删除[]采购订单

这里n可以是任何垃圾值,我们不知道它的大小,也许我们开始访问我们不拥有的内存。这可能有问题。 你应该先接受输入

中国

p_OrderBooks=新订单簿[n]


如果您正在做这样的事情:

订单簿*p_订单簿

int n

p_OrderBooks=新订单簿[n];//这里n包含垃圾

中国

删除[]采购订单

这里n可以是任何垃圾值,我们不知道它的大小,也许我们开始访问我们不拥有的内存。这可能有问题。 你应该先接受输入

中国

p_OrderBooks=新订单簿[n]


我发现了问题。我将指向在基类中创建的对象的指针传递给
OrderBook
对象

Server* p_Server = new Server(); // Some class
...
pOrderbook[i]->SetServer(p_Server) // <- for i=[0:99]
然后在
OrderBook
的发行版中,我试图删除仍在基类中使用的
p_ServerBase

...
~OrderBook()
{
    delete p_ServerBase;
}

我以前从未有过这样的经历。我不会再那样做了:)

我发现了问题。我将指向在基类中创建的对象的指针传递给
OrderBook
对象

Server* p_Server = new Server(); // Some class
...
pOrderbook[i]->SetServer(p_Server) // <- for i=[0:99]
然后在
OrderBook
的发行版中,我试图删除仍在基类中使用的
p_ServerBase

...
~OrderBook()
{
    delete p_ServerBase;
}

我以前从未有过这样的经历。我不会再这样做了:)

为什么不使用
std::vector
并避免在一开始就处理指针?您可能删除了两次数组,这在处理低级别内存分配时很容易做到。如果您将数组替换为
std::vector
s,您会遇到同样的问题吗?可能是输入错误,但您不会创建和删除同一个指针。。。名称不同。@ AUBIIS:那么您可以考虑<代码> STD::UnQuyJPTR <代码>,它应该像哑指针一样高效,同时仍然正确地管理内存分配。(与哑指针一样,您需要单独跟踪数组大小;但这样可以避免
vector
维护容量的开销,以及在容量增长时初始化元素的值)。@Anubis-
我正在测试性能。
您甚至没有可用的程序。你不能优化一个坏掉的程序。在开发出正确运行的程序后,您可以“体验性能”。应使用STL容器或智能指针来确保程序正常运行。然后分析代码以确定什么是慢的。然后,也只有到那时,你才能进行微调(如果你需要微调的话)。为什么不使用
std::vector
,避免在一开始就改变指针?您可能删除了两次数组,这在处理低级别内存分配时很容易做到。如果您将数组替换为
std::vector
s,您会遇到同样的问题吗?可能是输入错误,但您不会创建和删除同一个指针。。。名称不同。@ AUBIIS:那么您可以考虑<代码> STD::UnQuyJPTR <代码>,它应该像哑指针一样高效,同时仍然正确地管理内存分配。(与哑指针一样,您需要单独跟踪数组大小;但这样可以避免
vector
维护容量的开销,以及在容量增长时初始化元素的值)。@Anubis-
我正在测试性能。
您甚至没有可用的程序。你不能优化一个坏掉的程序。在开发出正确运行的程序后,您可以“体验性能”。应使用STL容器或智能指针来确保程序正常运行。然后分析代码以确定什么是慢的。然后,只有到那时,你才能微调(如果你需要微调的话)。对不起,我已经纠正了打字错误。我怎么能像你建议的那样超支??在注释了那一行之后,程序运行得很好??你说这是一个复杂的程序,所以你可能在某处错误计算了数组索引。例如,您为10个项目分配了足够的空间,但随后编写了12个项目。这种事情会导致程序崩溃