我的问题是从堆内存中删除一个数组.我读过一本书,这个博客和其他资源,像这样的,他们都表示,从堆删除阵列,我们必须使用[]在后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无法检测到这种泄漏的内存,那么有任何可以检测到的包.
作为 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) 在查看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)
为什么编译器能够在最后一种情况下推断出类型?两者有什么区别吗?
请假设我想在 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) 当我将其添加到 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) 我想实现一个包含全局变量的源文件,并且我想通过inline static. 我可以在翻译单元的上下文中更改变量(例如,i),但是当我在该翻译单元之外调用该变量时,调用者的结果将保持不变。就好像每个单元都有一个副本。请参阅下面的示例:
#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)
#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)