C++ 函数导致应用程序崩溃且无法正常工作

2024-04-09

我的应用程序中出现了一个问题,我的 PrintAll 函数无法正常工作,最终只会使我的应用程序崩溃。我的应用程序应该从文件中读取字符串并将它们插入到数组中。问题是它读取不正确,最终会使我的应用程序崩溃。我认为问题出在这儿:

int main()
{
    LoadMovies();

    MovieList *movies = LoadMovies();
    //movies->MovieList::PrintAll();

    //    // test methods for the Movie and MovieList classes
        //PrintAllMoviesMadeInYear(movies, 1984);
        //PrintAllMoviesWithStartLetter(movies, 'B');
        //PrintAllTopNMovies(movies, 5);

    //delete movies;
    return 0;
}

MovieList* LoadMovies()
{
    vector<string> movies;
    ReadMovieFile(movies);
    MovieList ml = MovieList(movies.size());

    string name;
    int year;
    double rating;
    int votes;

    for (int i = 0; i < movies.size(); i++)
    {
        istringstream input_string(movies[i]);
        getline(input_string, name, '\t');
        input_string >> year >> rating >> votes;
        Movie movie (name, year, votes, rating);
        ml.Add(movie);
    }
    ml.PrintAll();
}

完整示例:

/*
 * File: MovieStatsProgram.cpp
 * Author:
 * Date:
 * ===============================================================
 * This is a console app to test the Movie and MovieList classes.
 *
 * TODO:
 *
 * You need to finish the implementation of the loadMovies method
 * to create and initialize the MovieList object.
 *
 * You also need to create three static methods:
 *
 * PrintAllMoviesMadeInYear - it will print all the movies made in a
 * given year once sort in alphabetical order and once sorted by the number
 * of votes with the movie with the most number of votes printed first.
 *
 * PrintAllMoviesWithStartLetter - it will print all the movies started with
 * a given letter sorted in alphabetical order
 *
 * PrintAllTopNMovies - it will display the top N movies based on the number of
 * votes
 */

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iomanip>
#include <fstream>

using namespace std;

class Movie {
public:
    Movie();
    Movie(string n, int y, int v, double r);
    string get_name();
    void set_name(string n);
    int get_year();
    void set_year(int y);
    int get_votes();
    void set_votes(int v);
    double get_rating();
    void set_rating(double r);
    string PrintMovie();

private:
    string name;
    int year_made;
    int votes;
    double rating;

};

Movie::Movie() {
    name = "null";
    year_made = 0;
    votes = 0;
    rating = 0.0;
}

Movie::Movie(string n, int y, int v, double r) {
    name = n;
    year_made = y;
    votes = v;
    rating = r;
}

string Movie::get_name() {
    return name;
}

void Movie::set_name(string n) {
    name = n;
}

int Movie::get_year() {
    return year_made;
}

void Movie::set_year(int y) {
    year_made = y;
}

int Movie::get_votes() {
    return votes;
}

void Movie::set_votes(int v) {
    votes = v;
}

double Movie::get_rating() {
    return rating;
}

void Movie::set_rating(double r) {
    rating = r;
}

string Movie::PrintMovie() {
    cout << fixed << setprecision(1) << rating << "\t\t" << votes << "\t\t" << "(" <<
            year_made << ")" << "\t" << name << endl;
}

class MovieList {
public:
    MovieList(int size);
    ~MovieList();
    int Length();
    bool IsFull();
    void Add(Movie const& m);
    string PrintAll();

private:
    Movie* movies;
    int last_movie_index;
    int movies_size;
    int movie_count = 0;

};

MovieList::MovieList(int size) {
    movies_size = size;
    movies = new Movie[movies_size];
    last_movie_index = -1;
}

MovieList::~MovieList() {
    delete [] movies;
}

int MovieList::Length() {
    return last_movie_index;
}

bool MovieList::IsFull() {
    return last_movie_index == movies_size;
}

void MovieList::Add(Movie const& m)
{
    if (IsFull()) {
        cout << "Cannot add movie, list is full" << endl;
        return;
    }

    ++last_movie_index;
    movies[last_movie_index] = m;
}

string MovieList::PrintAll() {
    for (int i = 0; i < last_movie_index; i++) {
        movies[last_movie_index].Movie::PrintMovie();
        //cout << movies[last_movie_index] << endl;
    }
}

void ReadMovieFile(vector<string> &movies);
MovieList* LoadMovies();

enum MovieSortOrder
{
    BY_YEAR = 0,
    BY_NAME = 1,
    BY_VOTES = 2
};

int main()
{
    LoadMovies();

    MovieList *movies = LoadMovies();
    //movies->MovieList::PrintAll();

    //    // test methods for the Movie and MovieList classes
        //PrintAllMoviesMadeInYear(movies, 1984);
        //PrintAllMoviesWithStartLetter(movies, 'B');
        //PrintAllTopNMovies(movies, 5);

    //delete movies;
    return 0;
}

MovieList* LoadMovies()
{
    vector<string> movies;
    ReadMovieFile(movies);
    MovieList ml = MovieList(movies.size());

    string name;
    int year;
    double rating;
    int votes;

    for (int i = 0; i < movies.size(); i++)
    {
        istringstream input_string(movies[i]);
        getline(input_string, name, '\t');
        input_string >> year >> rating >> votes;
        Movie movie (name, year, votes, rating);
        ml.Add(movie);
    }
    ml.PrintAll();
}

void ReadMovieFile(vector<string> &movies)
{
    ifstream instream;
    instream.open("imdbtop250.txt");
    if (instream.fail())
    {
        cout << "Error opening imdbtop250.txt" << endl;
        exit(1);
    }


    while (!instream.eof())
    {
        string movie;
        getline(instream, movie);
        movies.push_back(movie);
    }

    instream.close();
}

当我在主函数中使用 MovieList::PrintAll 时,我的函数就崩溃了,当我将其放入 LoadMovies 函数中时,它会在崩溃之前错误地读取和添加数据。列表的大小为 251,应用程序只会读取相同的数据 251 次。


你有一个两部分的问题:

1:正如 Brad S 所说,你的函数什么也不返回。这是一个禁忌。

MovieList* LoadMovies()
{
    MovieList ml = MovieList(movies.size());
    // Your function returns a pointer to a MovieList, so...
    return &ml;
}

因此,问题#2 是您将返回一个指向您在函数的堆栈上创建的内容的指针。当您尝试在函数之外访问它时,您将遇到未定义的行为。

选项1:

 MovieList* ml = new MovieList( movies.size() );
 return ml;

现在,您需要在完成后删除 ml。

选项2: 更改您的函数以返回非指针...那么您就没有管理内存的麻烦了。

编辑:试试这个

int main()
{
    // Don't need this
    // LoadMovies();

    MovieList *movies = LoadMovies();

    // Uncommented this
    delete movies;
return 0;
}

MovieList* LoadMovies()
{
    vector<string> movies;
    ReadMovieFile(movies);
    // CHANGE
    MovieList* ml = new MovieList(movies.size());
    // CHANGE

    string name;
    int year;
    double rating;
    int votes;

    for (int i = 0; i < movies.size(); i++)    
    {
        istringstream input_string(movies[i]);
        getline(input_string, name, '\t');    
        input_string >> year >> rating >> votes;
        Movie movie (name, year, votes, rating);
        ml.Add(movie);
    }
    ml.PrintAll();
    // CHANGE
    return ml;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 函数导致应用程序崩溃且无法正常工作 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • Xcode 8 警告:“__textcoal_nt”部分已弃用

    我最近在 el cap 上更新到了 Xcode 8 今天早些时候我做了一个 xcode select install 还运行了brew来安装几个命令 我还更新了 Podfile 然后启动了 Xcode 8 直到现在我还没有为我正在处理的特定
  • 删除 Symfony2 表单中的表单命名空间(针对 REST API)

    我正在使用 Symfony2 设计 REST API 对于 POST 和 PUT 请求 我使用 FormType 就像是 class EmailType extends AbstractType public function buildF
  • SwiftUI 文本动画不透明度不起作用

    问题很简单 我到底如何才能获得Text正确设置动画 struct ContentView View State var foozle String var body some View VStack Spacer Text self foo
  • Java:加载重构后保存在硬盘上的对象=>“找不到类”异常:/

    我正在用java开发一个应用程序 它使用这个简单的方法定期将对象保存到硬盘上 public void save String filename try FileOutputStream fos new FileOutputStream fi
  • 在代码中重新加载反应本机应用程序

    我的用例是在单击按钮时重新加载应用程序 以便在单击后可以重新定义许多属性 有没有一种方法可以通过代码重新加载 React Native 应用程序 Thanks 这是一个巨大的解决方法 但它节省了大量时间 并避免了因摇晃不正确而带来的挫败感
  • 无法找到 WAMP 64 / Openssl Ordinal 372

    我正在尝试生成 SSL 证书 但我在这样做时遇到了这个错误 The 序数 372无法定位动态链接库 C wamp64 bin apache apache2 4 7 bin openssl exe 我已经搜索了一段时间 但解决方案不够详细 我
  • PKCS11异常:CKR_KEY_FUNCTION_NOT_PERMITTED

    你看 我有一个小程序 可以根据RSA在 pkcs11 令牌中找到的私钥 在巴西 现在有一些包含 2048 位私钥的新证书 也有常规 1024 位的旧型号 到目前为止 我的应用程序运行良好 我使用的是 1024 位证书 所以不用担心 但现在我
  • 使用 !== 或 != 将 Julia 变量与 `nothing` 进行比较

    在一些 Julia 代码中 何时可以看到条件表达式 例如 if val nothing dosomething end where val是一个类型变量Union Int Nothing 条件有什么区别val nothing and val
  • 返回布尔值和字符串值的最佳实践是什么

    我创建了一个方法 该方法对 XML 层次结构执行一些验证 该层次结构是在运行时由 Javascript 文本中的另一个类动态生成的 我的方法当前返回 True 或 False 这对使用我的类的任何人都有帮助 但我还想返回更多信息 因为可能有
  • CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入

    我正在尝试编写一个使用CreateRemoteThread注入一个dll 问题是 CreateRemoteThread 拒绝工作 GetLastError 返回 5 即 ERROR ACCESS DENIED 我不明白为什么 我正在根据这个
  • SNMP 错误,端口已在使用中

    我创建了一个 SNMP 代理模拟器应用程序 它对模拟设备使用端口号 161 有时会出现端口已使用异常 如何知道161端口是否繁忙 只需启动您的应用程序即可 如果它收到 BindException 则该端口正在使用中 如果没有 您的应用程序可
  • 如何在设定时间后关闭 ProgressDialog?

    我试图在 3 秒后自动关闭 ProgressDialog 框 这是对话框 ProgressDialog progress new ProgressDialog this progress setTitle Connecting progre
  • 如何在C#中通过解析Xml创建表达式树?

    我希望通过使用 C 解析 xml 来创建表达式树 xml 如下所示
  • 如何创建历史事实表?

    我的数据仓库中有一些实体 Person 具有 personId dateFrom dateTo 和其他可以更改的属性 例如姓氏 出生日期等 缓慢变化的维度 Document 文档 ID 编号 类型 Address 地址 ID 城市 街道 房
  • 阻止 Hibernate 创建非空约束

    有没有办法阻止 Hibernate 为带有注释的属性创建非空约束 javax validation constraints NotNull使用时hbm2ddl create 来自 Hibernate Validator 的文档 6 1 数据
  • 对包含空标记的字符串进行标记

    我有一个看似简单的问题 就是用逗号分隔String到令牌中 在以下情况下输出应包含空令牌 中的第一个字符String是一个逗号 中的最后一个字符String是一个逗号 出现两个连续的逗号 例如 对于String abd def ghi 应该
  • Java XMLGregorianCalendar 转换为 Java util.Date 时存在错误?

    我正在将日期 时间值写入 XML 文件 方法是从基于 RAP 的 UI 中读取日期作为 Java Date 对象 并将其作为XMLGregorianCalendar反对实际的文件编写代码 相应的类是自动生成的 我无法控制它们 我输入的日期是
  • Java中String(String)构造函数的使用[重复]

    这个问题在这里已经有答案了 我读过的文章和书籍使用String s new String 应该一直避免 我明白为什么会这样 但是使用 String String 构造函数有什么用处吗 我认为不存在 也没有看到任何其他证据 但我想知道 SO
  • 层位置在(核心)动画开始时跳跃

    因此 我尝试创建一个平铺翻转效果 就像在 Windows Phone 7 上一样 到目前为止 我有以下代码 但我有几个疑问 CALayer layer self theRedSquare layer CATransform3D initia
  • C++ 函数导致应用程序崩溃且无法正常工作

    我的应用程序中出现了一个问题 我的 PrintAll 函数无法正常工作 最终只会使我的应用程序崩溃 我的应用程序应该从文件中读取字符串并将它们插入到数组中 问题是它读取不正确 最终会使我的应用程序崩溃 我认为问题出在这儿 int main