diff options
| author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-10-30 21:51:06 +0100 | 
|---|---|---|
| committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-10-30 21:51:06 +0100 | 
| commit | 80ed1262bd654fe2de30389f97a985b5f2c1d783 (patch) | |
| tree | 020b1b63d637e07882c9a10d81fe2ac04ce82bcc /backend | |
| parent | c45a436fc594101f676cfabe90225d825d935fec (diff) | |
add more containers and fix use after free
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/Dungeon.cpp | 10 | ||||
| -rw-r--r-- | backend/Dungeon.h | 11 | ||||
| -rw-r--r-- | backend/List.h | 4 | ||||
| -rw-r--r-- | backend/List.hpp | 5 | ||||
| -rw-r--r-- | backend/Location.cpp | 6 | ||||
| -rw-r--r-- | backend/Location.h | 16 | ||||
| -rw-r--r-- | backend/PtrList.h | 14 | ||||
| -rw-r--r-- | backend/PtrList.hpp | 10 | ||||
| -rw-r--r-- | backend/String.cpp | 1 | ||||
| -rw-r--r-- | backend/util.h | 6 | ||||
| -rw-r--r-- | backend/util.hpp | 11 | 
11 files changed, 47 insertions, 47 deletions
| diff --git a/backend/Dungeon.cpp b/backend/Dungeon.cpp index e1cee70..d4df1ef 100644 --- a/backend/Dungeon.cpp +++ b/backend/Dungeon.cpp @@ -1,16 +1,6 @@  #include "Location.h"  #include "Dungeon.h"  #include "RNG.h" -#include "util.h" - - -Dungeon::Dungeon() { - -} - -Dungeon::~Dungeon() { -	safe_free(this->locations); -}  void Dungeon::update() {  	// TODO: iterators are broken (!????) diff --git a/backend/Dungeon.h b/backend/Dungeon.h index eaca6c3..be8b52e 100644 --- a/backend/Dungeon.h +++ b/backend/Dungeon.h @@ -1,13 +1,12 @@  #pragma once -#include "List.h" - -class Location; +#include "Location.h" +#include "PtrList.h"  class Dungeon {  public: -	Dungeon(); -	~Dungeon(); +	Dungeon() = default; +	virtual ~Dungeon() = default;  public:  	void update(); @@ -15,7 +14,7 @@ public:  	Location * get_start_location();  private: -	List<Location *> locations; +	PtrList<Location> locations;  }; diff --git a/backend/List.h b/backend/List.h index 58efbe2..1af0b35 100644 --- a/backend/List.h +++ b/backend/List.h @@ -18,6 +18,10 @@ struct ListLink {  template<typename T>  class List {  public: +	List() = default; +	virtual ~List(); + +public:  	size_t size() const;  	void push_back(T & el); diff --git a/backend/List.hpp b/backend/List.hpp index c2c5ce2..f4dce23 100644 --- a/backend/List.hpp +++ b/backend/List.hpp @@ -85,3 +85,8 @@ ListIterator<T> List<T>::end() const {  	return this->range().end();  } +template <typename T> +List<T>::~List() { +	this->clear(); +} + diff --git a/backend/Location.cpp b/backend/Location.cpp index 7246246..bfd2107 100644 --- a/backend/Location.cpp +++ b/backend/Location.cpp @@ -20,12 +20,6 @@ Direction random_direction(const Location & location) {  Location::Location(const String & name, const String & description) : name(name), description(description) { } -Location::~Location() { -	safe_free(this->enemies); -	safe_free(this->hidden_objects); -	safe_free(this->visible_objects); -} -  void Location::set_name(const String & name) { this->name = name; }  const String & Location::get_name() const { return this->name; } diff --git a/backend/Location.h b/backend/Location.h index 464328b..3a1f5ac 100644 --- a/backend/Location.h +++ b/backend/Location.h @@ -1,11 +1,11 @@  #pragma once -#include "List.h" +#include "PtrList.h"  #include "ListIterator.h" -#include "backend/String.h" +#include "String.h" +#include "Enemy.h" +#include "Object.h" -class Enemy; -class Object;  class Location;  enum Direction { @@ -49,14 +49,14 @@ private:  	friend class LocationFactory;  	Location(const String & name, const String & description);  public: -	virtual ~Location(); +	virtual ~Location() = default;  private:  	String name;  	String description; -	List<Enemy*> enemies; -	List<Object*> hidden_objects; -	List<Object*> visible_objects; +	PtrList<Enemy> enemies; +	PtrList<Object> hidden_objects; +	PtrList<Object> visible_objects;  	Location * edges[4] = {  		nullptr, diff --git a/backend/PtrList.h b/backend/PtrList.h new file mode 100644 index 0000000..5442043 --- /dev/null +++ b/backend/PtrList.h @@ -0,0 +1,14 @@ +#pragma once + +#include "List.h" + +template<typename T> +class PtrList : public List<T *> { +public: +	using List<T *>::List; +	virtual ~PtrList(); +}; + +#include "PtrList.hpp" + + diff --git a/backend/PtrList.hpp b/backend/PtrList.hpp new file mode 100644 index 0000000..96f2643 --- /dev/null +++ b/backend/PtrList.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "PtrList.h" + +template <typename T> +PtrList<T>::~PtrList() { +	for (T * obj : *this) +		delete obj; +} + diff --git a/backend/String.cpp b/backend/String.cpp index e387589..a8b648a 100644 --- a/backend/String.cpp +++ b/backend/String.cpp @@ -34,6 +34,7 @@ String String::va_fmt(va_list args, const char * fmt) {  	out._data_len = vsnprintf(NULL, 0, fmt, args_copy);  	va_end(args_copy); +	safe_free(out._data);  	out._data = static_cast<char *>(malloc(out._data_len + 1));  	vsnprintf(out._data, out._data_len + 1, fmt, args);  	return out; diff --git a/backend/util.h b/backend/util.h index e544e19..83cae58 100644 --- a/backend/util.h +++ b/backend/util.h @@ -2,14 +2,8 @@  #include <stdio.h> -#include "List.h" -  void safe_free(void * & ptr);  void safe_free(char * & ptr);  void safe_free(const char * & ptr); -template <typename T> -void safe_free(List<T *> & ptr_list);  void safe_free(FILE * & ptr); -#include "util.hpp" - diff --git a/backend/util.hpp b/backend/util.hpp deleted file mode 100644 index 2d9e76a..0000000 --- a/backend/util.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "util.h" - -template <typename T> -void safe_free(List<T *> & ptr_list) { -	for (T * obj : ptr_list) -		delete obj; -	ptr_list.clear(); -} - |