小编Vio*_*ffe的帖子

释放相机:"释放后调用的方法()"异常

我正在尝试在我的应用中加入一些与相机相关的功能.我手动打开摄像头,并获得与预览流setPreviewCallbackstartPreview.我使用曲面来显示预览,但我确实将其设置为符合Camera API文档.这是我打开相机的方式:

public Camera openCamera(int id)
{
    m_openedCamera = Camera.open(id);
    m_surfaceHolder = new SurfaceView(MyApplication.instance().getApplicationContext()).getHolder();
    Assert.assertNotNull(m_openedCamera);
    m_openedCamera.setPreviewDisplay(m_surfaceHolder);
    m_openedCameraFacing = facing;
    if (m_openedCamera != null)
        m_openedCamera.setPreviewCallback(this);
    m_openedCamera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)

这就是我发布它的方式,这里没什么好看的:

public void releaseCamera()
{
    if (m_openedCamera != null)
    {
        m_openedCamera.stopPreview();
        m_openedCamera.release();
        m_openedCamera = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

它有点起作用,但是当我释放相机时,我得到一个异常"在释放后调用的方法()".澄清一下:相机发布后我不会调用任何相机方法.在调试器下进行双重和三重检查,我没有.我认为这里有混合的同步和异步调用会导致问题.

camera android android-camera

1
推荐指数
1
解决办法
713
查看次数

为什么在rvalue引用上使用std :: forward会导致被引用对象的破坏?

#include <functional>
#include <memory>
#include <iostream>

struct A
{
    ~A() {std::cout << "~A()" << std::endl;}
};

void test(std::shared_ptr<A> ptr)
{
    std::cout << (ptr ? "not empty" : "empty") << std::endl;
}

void forwarder(std::function<void(std::shared_ptr<A>)> f, std::shared_ptr<A>&& ptr)
{
    f(std::forward<std::shared_ptr<A>>(ptr));
    f(std::forward<std::shared_ptr<A>>(ptr));
}

void main()
{
    forwarder([](std::shared_ptr<A> ptr){ test(ptr); }, std::make_shared<A>());
}
Run Code Online (Sandbox Code Playgroud)

问题在于forwarder功能.在第一次调用后,testshared_ptr与一起-被破坏A的对象,很明显.所以在第二次调用test指针时已经是空的.我不明白为什么会这样.std::forward实施是微不足道的.
所以,我有两个问题:
1.如何std::forward导致rvalue对象的破坏传递给它?哪一段代码呢?
2.如何解释这个C++设计决策?似乎违反直觉的,我认为ptr超出范围还没有,但已经死了.

c++ rvalue-reference perfect-forwarding c++11

1
推荐指数
1
解决办法
356
查看次数

Qt连接转换失败

我尝试连接一个QGraphicsObject子类和一个QGraphicsView子类(在QGraphicsObject构造函数中使用以下行)

connect(this, SIGNAL(paintImage(QPainter *, const QImage &)), this->scene()->views().front(), SLOT(paintImage(QPainter *, const QImage &)));
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

D:\Project\Scene\PointField.cpp:18: error : C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const: cannot convert 'QGraphicsView *' to 'const QObject *'
The point types are unrelated; conversion needs reinterpret_cast, C style cast or function style cast.
Run Code Online (Sandbox Code Playgroud)

我从QGraphicsView继承自的文档中看到QObject,并且Q_OBJECT两个子类声明中都有宏...有人有想法吗?

c++ qt

1
推荐指数
1
解决办法
441
查看次数

如何调整换行限制(maxmum line length)?

代码样式设置下有各种ON/OFF换行选项,但我看不到调整限制的位置.说,我想要120个字符而不是80个字符.

intellij-idea android-studio

1
推荐指数
1
解决办法
1474
查看次数

QListWidget不允许图标大小超过200

QListWidget::setIconSize尺寸> 200x200似乎没有任何影响.是故意还是我做错了什么?在文档中没有提到这样的上限.可能有另一个属性限制图标大小?

我正在使用Qt 5.

c++ qt qt5

0
推荐指数
1
解决办法
2436
查看次数

POSIX或Linux API函数从路径获取文件扩展名

我需要一个POSIX或Linux API函数来获取文件路径并返回此文件的扩展名.每个平台都应该有一个,但我不能用于Linux.它叫什么?

c++ linux posix

0
推荐指数
1
解决办法
2037
查看次数

将AVX与GCC一起使用:__ builtin_ia32_addpd256未声明

如果我#include <immintrin.h>收到此错误:

错误:未在此范围内声明'__builtin_ia32_addpd256'

我已定义__AVX____FMA__宏使AVX可用,但显然这还不够.如果我使用编译器标志-mavx而不是宏,则没有错误,但该解决方案是不可接受的.那么,我还应该定义什么才能使用AVX?

c++ gcc avx fma

0
推荐指数
1
解决办法
2104
查看次数

具有空捕获列表的Lambda仍然能够从全局范围捕获对象?

我有几个全局静态对象.别介意这些是Qt类,这与此事无关.

static const QStringList JpegFileExtensions = QString::fromLatin1(jpegExtensions).split(" ");
static const QStringList TiffFileExtensions = QString::fromLatin1(tiffExtensions).split(" ");
static const QStringList RawFileExtensions = QString::fromLatin1(rawExtensions).split(" ");
static const QStringList PngFileExtensions = QString::fromLatin1(pngExtensions).split(" ");
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个静态对象,它由一些函数初始化,它接受前面的对象并计算结果:

inline QString GetAllSupportedExtensions() {
   QStringList extensions = QStringList() << JpegFileExtensions << TiffFileExtensions << RawFileExtensions << PngFileExtensions;
   for (QString& item: extensions)
        item.remove("*.");

   return extensions;
}

static const QString AllSupportedExtensions = GetAllSupportedExtensions();
Run Code Online (Sandbox Code Playgroud)

但由于这个GetAllSupportedExtensions函数没有在其他地方使用,我想摆脱它,以免它混淆命名空间.当然,我想过使用lambda,它是一个匿名函数:

static const QStringList AllSupportedExtensions = []() -> QStringList {
    QStringList list = QStringList() << JpegFileExtensions << TiffFileExtensions …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

0
推荐指数
1
解决办法
385
查看次数

是否允许memcpy的src和dest参数重叠?

我需要移位字节缓冲区的内容.当然,我开始写作memcpy,但后来意识到它可能restrict有源和目标的说明符.我的实施(MSVC 2013)似乎没有它.Cppreference列出了两个memcpy版本,有和没有restrict,但我没有得到它 - 我不认为这些是重载,并且我不清楚编译器如何正确地确定选择哪一个.另一方面,该memcpy函数可以count在运行时分析地址和参数,以确定地址范围是否重叠.

那么,允许memcpy使用重叠参数调用吗?如果没有,有没有办法执行比普通更好的操作for

c++ memcpy

0
推荐指数
1
解决办法
217
查看次数

折叠表达式:迭代可变参数模板类型参数以检查包含类型的编译时条件

我想要做的很简单:在一个可变的类模板中,我想检查类型的一些编译时条件.在这种情况下,我想知道包装中是否有某种类型.这就是C++ 17的折叠表达式可能看起来的代码,但显然这不是有效的语法.怎么实现呢?

#include <type_traits>

template <class... Types>
struct TypesPack
{
    template <typename T>
    static constexpr bool hasType() {
        return std::is_same<T, Types>::value || ... || false;
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ templates c++17

0
推荐指数
1
解决办法
263
查看次数

模板函数:是否有接受任何参数类型的语法,因为'auto'对lambdas有效?

我正在尝试编写一个接受复杂参数的函数.假设它可以是一个类,或者它可以是一个类模板.函数内部的代码对于所有参数都是相同的,我不需要在任何地方引用参数的类型.所以,我想写这样的东西:

auto func(auto& someComplicatedClassInstance) {
   return someComplicatedClassInstance.someMemberFunc();
}
Run Code Online (Sandbox Code Playgroud)

我不能只是写,template <typename T>因为如果T本身就是模板,它就不会起作用,而且auto函数参数在C++中不是.制作funclambda是唯一的方法吗?奇怪的是,为lambda启用相同的编译器功能,但不启用普通函数.在我的具体情况下,我正在写一个重载因为operator<<我不能使它成为一个lambda.

c++ c++17

-1
推荐指数
1
解决办法
71
查看次数

按值返回std :: array

一个简单的问题,但我无法找到答案,既不是在SO上,也不是在cppreference.com和类似网站上.

std::array按价值返回是否合法?

std::array<int, 3> f() {
   return std::array<int, 3> {1, 2, 3};
}
Run Code Online (Sandbox Code Playgroud)

如果它是合法的,那么按价值将它传递给函数也是合法的,对吗?

c++ arrays c++11

-3
推荐指数
1
解决办法
217
查看次数