为什么将字符串指针转换为void指针并返回导致字符串数据消失?(Opencv)



我试图创建一个函数,在一个地方初始化每个OpenCV窗口的所有鼠标处理程序。代码在主循环中工作,但不在我的函数中(是的,我是通过引用传递的)。
问题似乎源于传递一个指针到字符串-当它从另一边出来时,它不会成功解引用(*)。到底发生了什么事?

下面是我正在谈论的一个极简示例(它为两个相同的窗口设置鼠标处理程序-一个窗口工作,另一个窗口不工作):

// mouse problem.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <string.h>
#include <iostream>  //for cout, cin
using namespace std;
using namespace cv;
void onMouse(int event, int x, int y, int flags, void* param){ 
    string windowname = *((string*)param);  //just recasting the void* we passed into the mousehandler to string
    if(windowname.empty()){
        cout << "ERROR.";
    }else{
        cout << "SUCCESS for window:" << windowname;
    }
    cout <<  "  param: "<< param << " windowname: "<< windowname << "n";
}
void initializer(const string& name){
        namedWindow( name, CV_WINDOW_AUTOSIZE );
        cout << " initializing mouse handler for " << name << " with string at address :" << &name << "n";
        setMouseCallback(name, onMouse, (void*)&name);  //this line is exactly the same as the other setmousecallback line
}
int _tmain(int argc, _TCHAR* argv[]){
    string name; Mat src; VideoCapture cap(0);  cap >> src; // get a single frame from camera
    //this works just fine
    name = "frameA";
    namedWindow( name, CV_WINDOW_AUTOSIZE );
    cout << " initializing mouse handler for " << name << " with string at address :" << &name << "n";
    setMouseCallback(name, onMouse, (void*)&name);
    //this fails even though it contains the same code and we pass by reference
    initializer("frameB");
    imshow("frameA",src);   imshow("frameB",src);  //display frame - mouseing over them triggers the OnMouse() event
    while(true){  //loop forever
        waitKey(30);
    }
    return 0;
}

这里是结果后,我鼠标在每个窗口一次。

真正杀死我的是,正如你在图片中看到的,字符串的地址被成功识别了!并且在将其转换为字符串时没有错误!但是当我去引用它的时候,它说它是空的!
是的,我确实试着避免使用Void*。遗憾的是,我无法避免空白。OpenCV需要void作为任何mousehandler函数的最后一个参数:(

问题与强制类型转换无关。您正在保留一个指向临时string对象的指针,并试图在该对象超出作用域后解引用该指针。

:

initializer("frameB");

等价于:

initializer(std::string("frameB"));

换句话说,创建了一个临时对象,函数获取并保存该临时对象的地址。由于临时变量在语句结束时消失,因此只剩下一个悬空指针。

相关内容

  • 没有找到相关文章

最新更新