persinammon / chatbot-extension

Change code to be memory efficient and resolve intentional bug that causes program to crash

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Memory Management Chatbot

My contribution: What was changed was changing manual new's and delete's to memory managed by smart pointers (all exclusive ownership so unique_ptr's), then using move semantics to move objects managed by smart pointers + save memory used, modifying functions to comply with Rule of 5, changing the chatbot to being declared on the stack so that when the program ends it is automatically cleaned up.

As stated in the original starter code - The ChatBot code creates a dialogue where users can ask questions about some aspects of memory management in C++. After the knowledge base of the chatbot has been loaded from a text file, a knowledge graph representation is created in computer memory, where chatbot answers represent the graph nodes and user queries represent the graph edges. After a user query has been sent to the chatbot, the Levenshtein distance is used to identify the most probable answer. The code was fully functional as-is and used raw pointers to represent the knowledge graph and interconnections between objects throughout the project.

Dependencies for Running Locally

Basic Build Instructions

  1. Make a build directory in the top level directory: mkdir build && cd build
  2. Compile: cmake .. && make
  3. Run it: ./membot.

Changes Made

  • Remove bug leading to crashing with segmentation fault when window closed and program called to end. This was due to a double free of resources.
  • In file chatgui.h / chatgui.cpp, make _chatLogic an exclusive resource to class ChatbotPanelDialog using an appropriate smart pointer. Where required, make changes to the code such that data structures and function parameters reflect the new structure.
  • In file chatbot.h / chatbot.cpp, make changes to the class ChatBot such that it complies with the Rule of Five. Make sure to properly allocate / deallocate memory resources on the heap and also copy member data where it makes sense to you. In each of the methods (e.g. the copy constructor), print a string of the type "ChatBot Copy Constructor" to the console so that you can see which method is called in later examples.
  • In file chatlogic.h / chatlogic.cpp, adapt the vector _nodes in a way that the instances of GraphNodes to which the vector elements refer are exclusively owned by the class ChatLogic. Use an appropriate type of smart pointer to achieve this. Where required, make changes to the code such that data structures and function parameters reflect the changes. When passing the GraphNode instances to functions, make sure to not transfer ownership and try to contain the changes to class ChatLogic where possible.
  • In files chatlogic.h / chatlogic.cpp and graphnode.h / graphnode.cpp change the ownership of all instances of GraphEdge in a way such that each instance of GraphNode exclusively owns the outgoing GraphEdges and holds non-owning references to incoming GraphEdges. Use appropriate smart pointers and where required, make changes to the code such that data structures and function parameters reflect the changes. When transferring ownership from class ChatLogic, where all instances of GraphEdge are created, into instances of GraphNode, make sure to use move semantics.
  • In file chatlogic.cpp, create a local ChatBot instance on the stack at the bottom of function LoadAnswerGraphFromFile. Then, use move semantics to pass the ChatBot instance into the root node. Make sure that ChatLogic has no ownership relation to the ChatBot instance and thus is no longer responsible for memory allocation and deallocation. Note that the member _chatBot of ChatLogic remains so it can be used as a communication handle between GUI and ChatBot instance. Make all required changes in files chatlogic.h / chatlogic.cpp and graphnode.h / graphnode.cpp. When the program is executed, messages on which part of the Rule of Five components of ChatBot is called should be printed to the console. When sending a query to the ChatBot, the output should look like the following:
ChatBot Constructor
ChatBot Move Constructor
ChatBot Move Assignment Operator
ChatBot Destructor
ChatBot Destructor 

About

Change code to be memory efficient and resolve intentional bug that causes program to crash

License:Other


Languages

Language:C++ 98.8%Language:CMake 1.2%