Bonjour,
Je suis en train d’écrire une petite librairie de manipulation de vecteur et matrice, et je voulais avoir un comportement proche du GLSL, c’est-à-dire pouvoir récupérer mes composantes de vecteur par « bloc » (par exemple sur un vec3 v
je peux faire v.xz()
pour manipuler uniquement la première et la troisième coordonnées). Pour pouvoir ensuite assigner directement les composantes par bloc, j’ai utilisé dans mes classes non pas des flottants, mais des pointeurs (sur des flottants). Cela donne pour vec2
(j’omets l’en-tête qui n’a rien d’intéressant) :
#include "math/vec2.hpp"
Vec2::Vec2(void) : m_x(new float(0)), m_y(new float(0)) {}
Vec2::Vec2(float x, float y) : m_x(new float(x)), m_y(new float(y)) {}
Vec2::Vec2(float* x, float* y) : m_x(x), m_y(y) {}
Vec2::~Vec2(void) {
delete m_x;
delete m_y;
m_x = nullptr;
m_y = nullptr;
}
float& Vec2::x(void) {
return *m_x;
}
float& Vec2::y(void) {
return *m_y;
}
std::ostream& Vec2::display(std::ostream& os) const {
os << "(" << *m_x << " ; " << *m_y << ")";
return os;
}
std::ostream& operator<<(std::ostream& os, const Vec2& vec) {
return vec.display(os);
}
J’ai ensuite réalisé quelques tests :
#include <iostream>
#include "math/vec2.hpp"
int main(int, char**) {
Vec2 v1 = Vec2(1.2, 2);
{
Vec2 v2 = Vec2(&(v1.x()), &(v1.y()));
std::cout << "v1 = " << v1 << std::endl;
std::cout << "v2 = " << v2 << std::endl;
// Modifier l'un revient à modifier l'autre
v2.y() = 3.141592;
std::cout << "v1 = " << v1 << std::endl;
std::cout << "v2 = " << v2 << std::endl;
// Les composantes ont la même adresse
std::cout << "@v1.x = " << &(v1.x()) << std::endl << "@v2.x = " << &(v2.x()) << std::endl;
}
std::cout << "v1 = " << v1 << std::endl;
return 0;
}
Et là je m’attendais à avoir une erreur de segmentation, en effet la variable v2
à la fin du scope est détruite, donc son destructeur est appelé, ce qui détruit aussi les deux composantes m_x
et m_y
, tout du moins je pensais que c’est ce qui se passerait. Mais le vecteur v1
s’affiche correctement. Je me questionne donc sur le fonctionnement du new
et du delete
en C++ dans ce contexte, et est-ce qu’il y a un risque que la variable v1
puisse avoir un comportement indéterminé au fur et à mesure du code après une telle opération (comme si la place des composantes en mémoire pouvait être réallouée pour autre chose) ? Dans le cas ou ce ne serait pas le cas, j’aimerais savoir si cette façon de fonctionner des objets vec
est bonne ou si il y aurait une meilleure alternative ?
Je vous remercie d’avance pour vos réponses.