我正在尝试使用函数NuiCreateSensorByIndex(int,INuiSensor**).我试图不使用裸指针,所以我做std::unique_ptr<INuiSensor> nui;
了一个unique_ptr.现在我想访问此函数,所以我执行以下操作:hr = NuiCreateSensorByIndex(i, &nui.get());
,但这是错误的:
KinectManager.cpp:29: error: C2102: '&' requires l-value
Run Code Online (Sandbox Code Playgroud)
我做错了什么以及如何解决?
我对CMake非常陌生,并且无法设置安装规则.我想在以下命令中运行以下命令make install
:
update-rc.d solshare_stats_runscript defaults
Run Code Online (Sandbox Code Playgroud)
但是我只想在以下情况下运行此命令:
CMAKE_INSTALL_PREFIX="/"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
目标是在模板对象中定义一个函数,其中void(void)作为原型.以下代码:
template <class T>
using ClassVoidFunctionPointer = void (T::*)(void);
class Scheduler {
public:
Scheduler(void);
~Scheduler(void);
template <class T>
void addTask(unsigned short interval, unsigned short delay,T templateClass,ClassVoidFunctionPointer classFunctionPtr );//For newer functions
...
}
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
inc/scheduler.h:18:77: error: 'ClassVoidFunctionPointer' is not a type
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?
我有一个很大的内存泄漏,我需要一些帮助来找出它来自哪里.首先,关于代码的一些理论:
这是一个Kinect项目.它是在MS Visual Studio 2012中构建的MFC项目,它使用Direct2D将图像放在屏幕上.当我从Kinect 1切换到Kinect 2时会发生此问题.然后重建除"主"对象之外的每个对象(解构/释放并置为NULL(如果指针)).这包括:
对于每个新关键字,我在析构函数中使用了delete关键字(所以我没有做任何事情来破坏那些没有用new初始化的指针).我关闭了所有线程处理程序并将它们设置为NULL.
现在我有内存泄漏,我需要一些帮助找到它.我开始使用MS MFC工具
初始化后我有一些输出:
Dumping objects ->
{402} normal block at 0x1531E8F0, 28 bytes long.
Data: << @ > 3C 07 06 00 F0 00 00 00 40 01 00 00 00 05 00 00
{401} normal block at 0x152F6CD8, 96 bytes long.
Data: < > > 00 CD CD CD 3E 07 06 00 D0 04 00 00 D8 17 00 00
{400} normal block at 0x03EA0040, …
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#!/usr/bin/perl
use Test::Simple tests => 2;
$file = "lalaletc";
$file2 = "lalal";
ok($file =~ m/^lala/);
ok($file2 =~ m/^lala$/);
Run Code Online (Sandbox Code Playgroud)
输出结果如下:
1..2
ok 1
not ok 2
# Failed test at ./test.pl line 7.
# Looks like you failed 1 test of 2.
Run Code Online (Sandbox Code Playgroud)
但$ file2没有更多的字符,所以我预计它会成功测试2.为什么不呢?
考虑以下两个示例,两个示例均使用g++ (GCC) 12.1.0
targeting x86_64-pc-linux-gnu
:进行编译g++ -O3 -std=gnu++20 main.cpp
。
示例1:
#include <iostream>
class Foo {
public:
Foo(){ std::cout << "Foo constructor" << std::endl;}
Foo(Foo&& f) { std::cout << "Foo move constructor" << std::endl;}
Foo(const Foo& f) {std::cout << "Foo copy constructor" << std::endl;}
~Foo() { std::cout << "Foo destructor" << std::endl;}
};
class Baz {
private:
Foo foo;
public:
Baz(Foo foo) : foo(std::move(foo)) {}
~Baz() { std::cout << "Baz destructor" << std::endl;}
};
Foo bar() {
return …
Run Code Online (Sandbox Code Playgroud) 我最近了解到,取消引用未与某个对象 ( ) 对齐的指针uint32_t* foo = (uint32_t*)7; *foo = 5;
实际上是未定义的行为:
C11 第 6.2.8 节:对象对齐:
完整的对象类型具有对齐要求,这对可以分配该类型的对象的地址施加了限制。对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象施加对齐要求:可以使用
_Alignas
关键字请求更严格的对齐。
好的,非常有趣。但malloc
似乎根本不关心对齐:
7.22.3.4
malloc
函数概要
#include <stdlib.h>
void *malloc(size_t size);
描述该
malloc
函数为大小由 size 指定且值不确定的对象分配空间。
退货该
malloc
函数返回空指针或指向已分配空间的指针。
因此:执行以下操作是否不太可能会引发未定义的行为?
uint32_t* a = malloc(10*sizeof(uint32_t));
*a = 7;
Run Code Online (Sandbox Code Playgroud)
毕竟,我们无法保证 的返回值与malloc
任何内容对齐。