summaryrefslogtreecommitdiffstats
path: root/src/core/Array.cpp
diff options
context:
space:
mode:
authorMarc <marc.gilleron@gmail.com>2021-01-31 20:15:44 +0000
committerGitHub <noreply@github.com>2021-01-31 20:15:44 +0000
commite8de1fa2a5e2974c273fde35bc5ecac375ae98ec (patch)
tree286a8e2e25c18fe11f346835b3021afae2e9b77f /src/core/Array.cpp
parent05ba977cc60653952b73dc03498ebc7a93cef120 (diff)
parentb400dba87534640eeddbcdb6b319335a6a7639d8 (diff)
downloadredot-cpp-e8de1fa2a5e2974c273fde35bc5ecac375ae98ec.tar.gz
Merge pull request #490 from Zylann/container_leaks
Fix container and string leaks
Diffstat (limited to 'src/core/Array.cpp')
-rw-r--r--src/core/Array.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/core/Array.cpp b/src/core/Array.cpp
index b63e935..dee4a5f 100644
--- a/src/core/Array.cpp
+++ b/src/core/Array.cpp
@@ -52,14 +52,16 @@ Array::Array(const PoolColorArray &a) {
Variant &Array::operator[](const int idx) {
godot_variant *v = godot::api->godot_array_operator_index(&_godot_array, idx);
- return *(Variant *)v;
+ // We assume it's ok to reinterpret because the value is a pointer whose data is already owned by the array,
+ // so can return a reference without constructing a Variant
+ return *reinterpret_cast<Variant *>(v);
}
-Variant Array::operator[](const int idx) const {
+const Variant &Array::operator[](const int idx) const {
// Yes, I'm casting away the const... you can hate me now.
// since the result is
godot_variant *v = godot::api->godot_array_operator_index((godot_array *)&_godot_array, idx);
- return *(Variant *)v;
+ return *reinterpret_cast<const Variant *>(v);
}
void Array::append(const Variant &v) {
@@ -84,12 +86,12 @@ void Array::erase(const Variant &v) {
Variant Array::front() const {
godot_variant v = godot::api->godot_array_front(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
Variant Array::back() const {
godot_variant v = godot::api->godot_array_back(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
int Array::find(const Variant &what, const int from) const {
@@ -118,12 +120,12 @@ void Array::invert() {
Variant Array::pop_back() {
godot_variant v = godot::api->godot_array_pop_back(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
Variant Array::pop_front() {
godot_variant v = godot::api->godot_array_pop_front(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
void Array::push_back(const Variant &v) {
@@ -170,17 +172,17 @@ int Array::bsearch_custom(const Variant &value, const Object *obj,
Array Array::duplicate(const bool deep) const {
godot_array arr = godot::core_1_1_api->godot_array_duplicate(&_godot_array, deep);
- return *(Array *)&arr;
+ return Array(arr);
}
Variant Array::max() const {
godot_variant v = godot::core_1_1_api->godot_array_max(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
Variant Array::min() const {
godot_variant v = godot::core_1_1_api->godot_array_min(&_godot_array);
- return *(Variant *)&v;
+ return Variant(v);
}
void Array::shuffle() {