小编Sae*_*omi的帖子

从堆中删除数组

我的问题是从堆内存中删除一个数组.我读过一本书,这个博客和其他资源,像这样的,他们都表示,从堆删除阵列,我们必须使用[]在后delete ,所以如果我们写代码,而无需使用功能,[]那么我们已经泄漏的内存.

例如,考虑下面的程序

int *s = new int[10];
delete [] s;
Run Code Online (Sandbox Code Playgroud)

我通过使用valgrind软件包在Linux中测试了这个小程序(这个程序包可以检查错误编码产生的泄漏内存量).通过Linux下面的命令,我们看到一切都没问题

sudo valgrind --leak-check=full ./<path_to_exe_file>
Run Code Online (Sandbox Code Playgroud)

这是Linux命令的输出

 ==4565== HEAP SUMMARY:
 ==4565==     in use at exit: 0 bytes in 0 blocks
 ==4565==   total heap usage: 1 allocs, 1 frees, 40 bytes allocated
 ==4565== 
 ==4565== All heap blocks were freed -- no leaks are possible
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用delete不使用[]时出现了我的问题,当我检查输出时,valgrind我看到所有堆内存都被释放,所以它是否正确?或者valgrind不知道整个堆没有被释放,阵列的某些部分仍然在那里!! ?? 如果valgrind无法检测到这种泄漏的内存,那么有任何可以检测到的包.

c++ arrays valgrind memory-leaks

11
推荐指数
2
解决办法
2980
查看次数

Android库中的getAssets()方法不起作用

作为 Android 编程的新手,我已将四个文件附加到我的库的资产文件夹中。
您可以看到附图。

图书馆

我想使用下面的代码通过 Android 库访问这些文件(如果我不在 Android 库中使用此代码,则当我在 MainActivity 中使用它时,它运行时不会出现错误)。

public void copy_weights() {
    try {
        AssetManager assetFiles = getAssets();
        String[] files = assetFiles.list("");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();  //catch the error in this line
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这段代码给了我错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.AssetManager android.Context.getAssets' on a null object refrence

我尝试了其他方法,例如直接访问home:///android_asset/7.cfg,但也无法访问文件。

编辑1

我像下面这样copy_weights()调用mainActivity

public class MainActivity extends AppCompatActivity {
@Override …
Run Code Online (Sandbox Code Playgroud)

java android android-assets

6
推荐指数
1
解决办法
2万
查看次数

为什么 std::apply 使用函数模板会失败,但使用具有显式模板参数列表的 lambda 表达式却不会失败?

在查看cpprefrence中的 std::apply 引用时,我们可以看到函数模板不能作为 std::apply 的可调用对象传递。让我们考虑以下函数模板:

template<typename T>
T add_generic(T first, T second) { return first + second; }
Run Code Online (Sandbox Code Playgroud)

因此,由于无法在 std::apply 调用中推导函数模板,因此我们不能使用以下代码:

std::apply(add_generic, std::make_pair(2.0f, 3.0f)); // Error: can't deduce the function type
Run Code Online (Sandbox Code Playgroud)

请注意,这与这个问题不是同一个问题。在该答案中,作者编写了一个没有显式模板参数的 lambda 表达式。

std::cout << std::apply(
    [](auto first, auto second) { return add_generic(first, second); },
    std::make_tuple(2.0f,3.0f)) << '\n';
Run Code Online (Sandbox Code Playgroud)

但正如您所知,在c++20中,您可以使用带有显式模板参数列表的 lambda 表达式。所以我尝试了这个功能,令人惊讶的是编译器没有引发任何错误。

std::apply([]<typename T>(T first,T second){
    return first+second;
},std::make_pair(2.0,3.0));
Run Code Online (Sandbox Code Playgroud)

为什么编译器能够在最后一种情况下推断出类型?两者有什么区别吗?

c++ lambda

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

如何使 OpenCV 成为我的 qt 项目的默认库?

请假设我想在 Qt-creator 中链接 OpenCV 库,一般来说,我将使用qmake 文件中INCLUDEPATH使用的LIBS变量添加标头和链接库,但如果我们在大多数项目中使用 OpenCV,那么我们必须每次都包含OpenCV库,那么有没有办法在创建项目时自动添加opencv库。我每次都使用以下命令为我的项目添加 OpenCV 库。

INCLUDEPATH += -I/usr/local/include/opencv
LIBS += -L/usr/local/lib -lopencv_stitching -lopencv_superres ...and etc.
Run Code Online (Sandbox Code Playgroud)

更新

我将为 OpenCV4 使用以下头文件:

INCLUDEPATH += /usr/local/include/opencv4
Run Code Online (Sandbox Code Playgroud)

c++ qt opencv qmake qt5

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

错误:找不到 id 为“kotlin-android”的插件。在 Android Studio 上

当我将其添加到 Android Studio 时出现此错误

"Error:Plugin with id 'kotlin-android' not found.".
Run Code Online (Sandbox Code Playgroud)

我正在尝试在我的 Android 上安装 opencv,但它不起作用。我在 Android 中创建了一个新项目,该项目是空的但可以运行

我的构建梯度

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

def openCVersionName = "4.5.4"
def openCVersionCode = ((4 * 100 + 5) * 100 + 4) * 10 + 0

println "OpenCV: " +openCVersionName + " " + project.buildscript.sourceFile

android {
compileSdkVersion 26

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 26

    versionCode openCVersionCode
    versionName openCVersionName

    externalNativeBuild {
        cmake {
            arguments "-DANDROID_STL=c++_shared"
            targets "opencv_jni_shared"
        }
    }
}

buildTypes {
    debug …
Run Code Online (Sandbox Code Playgroud)

java android opencv kotlin android-studio

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

不同翻译单元中的内联静态变量具有不同的值(c++17)

我想实现一个包含全局变量的源文件,并且我想通过inline static. 我可以在翻译单元的上下文中更改变量(例如,i),但是当我在该翻译单元之外调用该变量时,调用者的结果将保持不变。就好像每个单元都有一个副本。请参阅下面的示例:

头文件.h

#ifndef UNTITLED1_TEST_H
#define UNTITLED1_TEST_H

namespace t {
    inline static int i{0};

    void inc() ;

    void print_i() ;
}

#endif //UNTITLED1_TEST_H
Run Code Online (Sandbox Code Playgroud)

头文件.cpp

#include "header.h"

void t::inc() {
    t::i++;
}

void t::print_i() {
    std::cout << t::i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

那么让我们看看程序如何执行:

主程序

#include "header.h"

int main() {
    t::inc();

    std::cout << t::i << std::endl; // -> output is: 0
    t::print_i(); // -> output is : 1
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该变量i在不同的翻译单元中具有不同的值,如何解决这个问题?我不能使用类或其他任何东西,因为客户想要这种格式的代码。

笔记

我可以做如下的事情,但这不是主要问题,我想要一个全局变量:

t::i++; //instead of t::inc(); …
Run Code Online (Sandbox Code Playgroud)

c++ static inline c++17

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