C++ 异常未处理的冲突访问

C++ 异常未处理的冲突访问,c++,visual-studio,C++,Visual Studio,我在函数assignbook中使用了一个动态数组来扩展它,我不知道为什么当我delete[]数组时,它会给我未处理的访问冲突 这是主要原因 int main() { Translator t; Book b; t.AssignBook(b); t.AssignBook(b); t.AssignBook(b); t.AssignBook(b); t.AssignBook(b); t.AssignBook(b); t.Assig

我在函数
assignbook
中使用了一个动态数组来扩展它,我不知道为什么当我
delete[]
数组时,它会给我未处理的访问冲突

这是主要原因

int main() {
    Translator t;
    Book b;
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    t.AssignBook(b);
    cout << t.getNumBooks();
}

您违反了0/3/5规则。您没有
书籍
的复制构造函数。因此,当您的代码执行以下操作时:

    for (int i = 0; i < numBooks; i++) {
        t[i] = translatebooks[i];
   }
因此,默认的复制构造函数为
作者
两个
Book
对象提供相同的值。无论哪一个先被破坏,它都会被删除。这使得另一个没有指向任何地方的指针

然后在展开阵列时运行以下代码:

  delete[] translatebooks;
这将销毁您复制的书籍,并销毁副本中的
作者
数组


寓意:不要使用原始指针。不要使用原始数组。我们有很多类可以让所有这些东西变得简单,为什么要让它变得困难呢?

仅仅因为程序在显示的代码中的某个地方崩溃,并不意味着这就是错误所在。C++不这样工作。这个bug可以出现在崩溃前运行的代码中的任何地方。这就是为什么stackoveflow.com告诉您,您需要显示一个任何人都可以剪切/粘贴、编译和运行的文件,完全如图所示,以便自己复制错误;否则任何人都帮不了你。我看不出显示的代码有什么问题,所以问题一定是在其他地方,你需要显示一个。你能提供一个这样我们就可以看到整个画面吗?你也可以修剪你已经开始的标签沙拉。C++ + CLI是C++语言的一种不同语言,很不幸的是名字。抱歉,这是我第一次使用堆栈溢出。我只是上传了整个代码,因为我不知道问题在哪里:/这是太多的代码,让人们去寻找未知的bug。创建一个完整的模型的目的是用最少的代码来重现问题。有时候,仅仅做这样一个例子就可以帮助你自己发现问题。:哦哦哦哦哦,那么我应该为它创建一个复制构造函数,还是应该使用setter为新的复制对象设置值呢!有很多好的选择。使用
std::vector
。使用
std::unique\u ptr
。使类型可移动并移动它。谢谢,伙计,我创建了一个复制构造函数,现在一切正常:D
    for (int i = 0; i < numBooks; i++) {
        t[i] = translatebooks[i];
   }
Book::~Book() {
//  cout << "Book " << BookTitle << " Destructed\n";
    delete[] Authors;
}
  delete[] translatebooks;