Ich habe ein wenig Verwirrung über den folgenden Fall. Ich habe die folgende C++ Klasse, die ein RGB-Pixel:Member-Objekt der C++ - Klasse: Wo sollte es zerstört werden?
class RgbColorVector
{
cv::Mat pM;
public:
RgbColorVector(unsigned int r,unsigned int g,unsigned int b)
{
pM = cv::Mat(3,1,CV_8UC1);
pM.at<unsigned char>(0,0) = r;
pM.at<unsigned char>(1,0) = g;
pM.at<unsigned char>(2,0) = b;
}
unsigned int getComponent(int c)
{
return (unsigned int)pM.at<unsigned char>(c,0);
}
Hier bin ich mit dem OpenCV Mat Objekt einen RGB-Wert zu halten. Normalerweise würde ich in solchen Fällen den cv :: Mat-Zeiger verwenden und den Heap-Speicher im Konstruktor mit einem neuen Operator belegen und ihn dann im Destruktor mit delete freigeben. Im obigen Fall rufe ich explizit den Konstruktor von cv :: Mat auf. Was ich erwartete war, dass wenn der Konstruktor von RgbColorVector beendet wird, der zugewiesene Speicher im cv :: Mat-Konstruktor zerstört würde. Aber anscheinend ist es nicht der Fall:
void func()
{
RgbColorVector rgbVec(105,42,45);
int g = rgbVec.getComponent(1);
std::cout<<g<<std::endl;
}
int main(int argc, const char * argv[]) {
func();
return 0;
}
Hier erhalte ich als Ausgabe 42. Ich bin mir bewusst, dass „rgbVec“ ist eine lokale (automatische) Variable und wenn „Func“ beendet wird, dessen Inhalt (Klassenmitglieder) wird zerstört werden. Darüber hinaus erwartete ich, dass der getComponent() -Aufruf einen zufälligen Wert zurückgeben würde, da jeder im cv :: Mat-Konstruktoraufruf zugewiesene Speicher zerstört wird, nachdem der Konstruktor von "rgbVec" zurückgegeben wurde. Ich bin hier ein wenig verwirrt, wie genau funktioniert der Speicherzuweisungsmechanismus in diesem Fall? Ist das cv :: Mat-Objekt im RgbColorVector() -Konstruktor nicht im Stapel zugeordnet?
Ich verstehe nicht, was für ein Verhalten man erwartet. Sie verwenden den Copy-Konstruktor eines cv :: Mat von pM = cv :: Mat (3,1, CV_8UC1); Das konstruierte Objekt befindet sich also in Ihrer Klassenmitgliedsvariablen (wobei es zerstört wird, wenn das Klassenobjekt zerstört wird), das sich am Ende von func() befindet. Wenn Sie tatsächlich auf freigegebenen Speicher zugreifen würden, werden keine "zufälligen" Werte zurückgegeben, sondern die Werte, die sich im Speicher befinden. Wenn der Speicher immer noch zu Ihrem Programm gehört und nicht überschrieben wurde, können Sie sogar die "richtigen" Werte beobachten, wenn Sie versehentlich den Speicher freigegeben haben. – Micka
Sehr schlechte Idee, Mat zu verwenden, um einen einzelnen Pixelwert zu speichern. Sie sollten besser Vec3b verwenden oder einfach 3 uchars verwenden – Miki