我正在制作一个Android,我希望用C++编写一些功能,并使用JNI进行通信。为此,我想通过传递自定义对象的C++函数来调用ArrayList函数。
样本:
public class Student{
String name;
String class;
int score;
}
...
public native ArrayList<Student> manipulateScore(ArrayList<Student>);
....
C++代码:
JNIEXPORT ?ArrayList<Student>? JNICALL Ja
这个问题听起来可能有点奇怪,但我从来没有完全理解为什么我们需要有两种不同的语法来删除C++中的动态分配内存?
例如,
int *p = new int[10];
delete[] p; // why not just delete p;?
在普通的老C中,您只需使用free函数来释放分配给指针的内存,而不管分配的元素数量如何。当然,C++要复杂一些,因为它允许类类型调用它们的析构函数等等。但是,我认为使用单一语法删除C++中动态分配的内存没有任何障碍。
有什么根本原因决定使用两个版本,delete和delete[]?
更重要的是,如果您使用delete而不是delete[],大多数编译器甚至都
我已经开始为我的C++项目考虑V8,我很难理解数据是如何在C++应用程序和V8引擎之间来回传递的。
下面是一些伪代码,我希望能够在JS中定义一个名为doPocess的全局函数,该函数执行一些处理,但只会被C++应用程序读取:
function doProcess(input, output){
for (var i in input){
var byte = input[i]
output.push(byte)
}
}
为了传递数据数组并捕获输出结果,C++代码应该是什么样子的?
我开始使用OpenCL C++应用程序接口。我已经使用de C API很长时间了。C++应用程序接口更优雅、更简单,代码更少臃肿,更不容易出错。但我需要设备I。在启动代码中,我这样做:
vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
//example, get devices from first platform
vector<cl::Device> devices;
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &devices
给定java和C++中的类行,并分别在java和C++中进行以下声明:
Line[] p;
和
Line *p;
当运行以下代码时,两种语言在语义上有什么不同:
p = new Line[7];
特别是,这两种语言是否都以相同的方式为数组分配堆内存?
对不起,我做了这个问题的研究,但我仍然觉得我还没有完全理解。
谢谢!
我知道在c++中,超出缓冲区边界的访问是未定义的行为。
下面是cp首选项的示例:
int table[4] = {};
bool exists_in_table(int v)
{
// return true in one of the first 4 iterations or UB due to out-of-bounds access
for (int i = 0; i <= 4; i++) {
if (table[i] == v) return true;
}
return false;
}
但是,我在c++标准中找不到段落。
有人
考虑以下程序:
int main()
{
int array[9];
const int (*p2)[9] = &array;
}
它在C++ (参见现场演示)中编译得很好,但在C中编译失败。默认情况下,GCC给出以下警告。(请参阅现场演示)。
prog.c: In function 'main':
prog.c:4:26: warning: initialization from incompatible pointer type [enabled by default]
const int (*p2)[9] = &array;
但是
由于指针算法是在同一个数组中定义的,所以我怀疑我们能否从另一个NULL中减去NULL。我对以下内容的执行情况感到关切:
//first and second can both either be from the same array
//or be both NULL
prtdiff_t sub(void *first, void *second){
//Do I really need this condition?
if(!first && !second)
return (ptrdiff_t) 0;
return second
以下是我编写的Calc[] calculators = new Calc[10]; calculators[0].AddToSum(10);代码(相应的类和方法也已编写完成)。但是我得到了"Object reference not set to a instance of an object“exception.Then,通过一些研究,我通过如下操作消除了这个异常。
for (int i = 0; i < 10; i++)
{
calculators[i] = new Calc();
}
谁能解释一下为什么我们需要重新分
据我所知,堆栈上的多维数组将按行顺序占据连续内存。根据C++标准,使用指向元素的指针对多维数组进行索引是否是未定义的行为?例如:
#include <iostream>
#include <type_traits>
int main() {
int a[5][4]{{1,2,3,4},{},{5,6,7,8}};
constexpr auto sz = sizeof(a) / sizeof(std::remove_all_extents<decltype(a)>::type);
int *p = &a[0][0];
int i = p
这里有很长时间的java程序员,是C++的新手。我一直在使用C风格的“传统”数组(类似于java中的数组)。我理解在C++中,我们可以创建一个简单的数组,如下所示:
Person people[3];
该数组的内容本质上是未初始化的垃圾值。当我打印出数组中每个元素的内容时,我(相信)正在获取每个元素的内存地址。
for(int i = 0; i < 3; i++){std::cout << &person[i] << std::endl;}
结果:
//Note, I get different results here when I use an enh
在的注释中出现了一个有趣的讨论:现在,虽然这里的语言是C,但讨论已经转移到了C++标准所指定的方面,即在使用像std::memcpy这样的函数访问多维数组的元素时是什么构成了未定义的行为。
首先,下面是这个问题中的代码,转换为C++,并尽可能使用const:
#include <iostream>
#include <cstring>
void print(const int arr[][3], int n)
{
for (int r = 0; r < 3; ++r) {
for (int c = 0; c < n; ++c) {
以下声明通过编译检查:
int arr[3];
vector<int[3]> vec; // ok !!
当尝试实际使用vec时,
vec.push_back(arr);
它会导致许多错误,如:
/usr/include/c++/4.6/ext/new_allocator.h:108:9: error: ISO C++ forbids initialization in array new [-fpermissive]
/usr/include/c++/4.6/bits/vector.tcc:314:4: error: invalid array assignment
/usr