分配私有缓冲区并使用指针修改内容
Allocating a private buffer and using a pointer to modify the contents
我想使用 allocate_buffer(...)
函数为 class A
中的私有 uint32_t 数组分配内存,该函数采用数组的大小和未初始化的指针 (void *data
) 指针。
指针应该用于访问A::buffer
的内存,这样就可以使用memcpy(...)
将数据复制到数组
memcpy(pointer_to_buffer, some_src_data, sizeof(some_src_data));
prg.hpp
class 具有私有缓冲区和用于分配和打印的函数
#ifndef PRG_HPP
#define PRG_HPP
#include <cstdint>
#include <stddef.h>
#include <cstdlib>
#include <iostream>
class A {
private:
void *buffer;
size_t count;
public:
void allocate_buffer(size_t size, void **data) {
buffer = malloc(size);
count = size;
data = &buffer;
}
void print_buffer() {
auto data = (uint32_t*)buffer;
for (size_t i = 0; i < count; i++) {
std::cout << data[i] << std::endl;
}
}
};
#endif
main.cpp
一个简单的程序,它使用prg.hpp
#include "prg.hpp"
#include <iostream>
#include <vector>
#include <cstring>
int main(void) {
// An objected of class A gets created
A a = {};
// A simple vector with ints up to 100, which acts as the src for malloc
std::vector<uint32_t> ints;
for (int i = 0; i < 100; i++) {
ints.push_back(i);
}
// buffer of object a is allocated and data should now be a pointer to the buffer
void *data;
size_t size = sizeof(uint32_t) * ints.size();
a.allocate_buffer(size, &data);
// Using the pointer to copy the contents of the vector ints to the buffer of object a
memcpy(data, ints.data(), size);
// Presentation
a.print_buffer();
return 0;
}
PS: 执行出现段错误
罪魁祸首是:
void allocate_buffer(size_t size, void **data) {
buffer = malloc(size);
count = size;
data = &buffer; // damned!
}
在一个函数或方法中,参数是局部变量,如果你改变它们,你只是改变了一个局部变量,它在函数结束时消失(它的生命周期在 C++ 措辞中结束)。
您正确传递了指针的地址:只需使用它:
*data = buffer; // good...
这样你就改变了调用者指针的值。
但是正如您在评论中所说,这种低级内存操作不是 C++ 惯用的方式。测试和学习没有什么不好,但不要在没有充分理由的情况下在现实世界的程序中这样做。
我想使用 allocate_buffer(...)
函数为 class A
中的私有 uint32_t 数组分配内存,该函数采用数组的大小和未初始化的指针 (void *data
) 指针。
指针应该用于访问A::buffer
的内存,这样就可以使用memcpy(...)
将数据复制到数组
memcpy(pointer_to_buffer, some_src_data, sizeof(some_src_data));
prg.hpp
class 具有私有缓冲区和用于分配和打印的函数
#ifndef PRG_HPP
#define PRG_HPP
#include <cstdint>
#include <stddef.h>
#include <cstdlib>
#include <iostream>
class A {
private:
void *buffer;
size_t count;
public:
void allocate_buffer(size_t size, void **data) {
buffer = malloc(size);
count = size;
data = &buffer;
}
void print_buffer() {
auto data = (uint32_t*)buffer;
for (size_t i = 0; i < count; i++) {
std::cout << data[i] << std::endl;
}
}
};
#endif
main.cpp
一个简单的程序,它使用prg.hpp
#include "prg.hpp"
#include <iostream>
#include <vector>
#include <cstring>
int main(void) {
// An objected of class A gets created
A a = {};
// A simple vector with ints up to 100, which acts as the src for malloc
std::vector<uint32_t> ints;
for (int i = 0; i < 100; i++) {
ints.push_back(i);
}
// buffer of object a is allocated and data should now be a pointer to the buffer
void *data;
size_t size = sizeof(uint32_t) * ints.size();
a.allocate_buffer(size, &data);
// Using the pointer to copy the contents of the vector ints to the buffer of object a
memcpy(data, ints.data(), size);
// Presentation
a.print_buffer();
return 0;
}
PS: 执行出现段错误
罪魁祸首是:
void allocate_buffer(size_t size, void **data) {
buffer = malloc(size);
count = size;
data = &buffer; // damned!
}
在一个函数或方法中,参数是局部变量,如果你改变它们,你只是改变了一个局部变量,它在函数结束时消失(它的生命周期在 C++ 措辞中结束)。
您正确传递了指针的地址:只需使用它:
*data = buffer; // good...
这样你就改变了调用者指针的值。
但是正如您在评论中所说,这种低级内存操作不是 C++ 惯用的方式。测试和学习没有什么不好,但不要在没有充分理由的情况下在现实世界的程序中这样做。