Qt_C2188-负下标C2027QScopedPointer
Posted DreamLife.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt_C2188-负下标C2027QScopedPointer相关的知识,希望对你有一定的参考价值。
我嘞个乖乖,这几天真是人间地狱呀,问题一串一串一串,还都是没有之前遇到的问题。这次遇到的是C2118:负下标
错误。真是没有天理了,这个代码是之前用着没有问题的呀,这个代码也是vtk的代码呀,我嘞个乖乖。
本次就是在抄VTKQVTKOpenGLNativeWidget
代码时候遇到的问题,这个代码在之前使用时没有问题的,这次问题出在哪里,还没有找到呢。
这里用到了QScopedPointer
,可以扒一扒。
一句话解决问题,包含对应头文件即可
[TOC]
关键字:
C2118
、Qt
、负下标
、C2027
、QScopedPointer
C2118:负下标错误
导致出错的代码 QScopedPointer<QVTKRenderWindowAdapter> RenderWindowAdapter;
报错信息:
C:\\Qt\\Qt5.14.2\\5.14.2\\msvc2015_64\\include\\QtCore\\qscopedpointer.h:57: error: C2118: 负下标
点击错误,定位到了下面的内容:
翻一下:执行完整类型,如果你在这里遇到编译错误,请阅读forward声明一节,QScopedPointer文档中的类。
QScopedPointer
QScopedPointer和C++中的智能指针std::unique_ptr其概念是一样的,他包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但他有更严格的所有权,并且不能转让,一旦获取了对象的管理权,你就无法在从它哪里取回来。也就是说,只要出了作用域,指针就会被自动删除,因为他的拷贝和赋值操作都是私有的,与QObject及其派生类风格相同。
看下官方示例:
没有使用只能指针的代码
void myFunction(bool useSubClass)
{
MyClass *p = useSubClass ? new MyClass() : new MySubClass;
QIODevice *device = handsOverOwnership();
if (m_value > 3) {
delete p;
delete device;
return;
}
try {
process(device);
}
catch (...) {
delete p;
delete device;
throw;
}
delete p;
delete device;
}
上面的写法,稍有不慎就会导致内存泄露,但是如果使用了只能指针,就会变得简单:
void myFunction(bool useSubClass)
{
// assuming that MyClass has a virtual destructor
QScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass);
QScopedPointer<QIODevice> device(handsOverOwnership());
if (m_value > 3)
return;
process(device);
}
C2027错误
使用了QScopedPointer
是绝对不是引发这种错误的,所以,问题还得看别处。这里我还看到了另一错误 C2027
,如下图所示。
这里面看到一个关键字,声明,难道是没有包含头文件
已经解决,傻了逼了。
参考链接
http://www.voidcn.com/article/p-yhjkkrsi-bwc.html
https://www.orcode.com/question/328389_k7b0cd.html
http://www.wisestudy.cn/opentech/error_C2118_nega_index.html
以上是关于Qt_C2188-负下标C2027QScopedPointer的主要内容,如果未能解决你的问题,请参考以下文章