malloc error when trying to assign the returned pointer to a struct field
Kagamin
spam at here.lot
Fri Sep 8 14:50:17 UTC 2023
On Friday, 8 September 2023 at 13:32:00 UTC, rempas wrote:
> On Friday, 8 September 2023 at 13:05:47 UTC, evilrat wrote:
>> ```d
>> import core.stdc.stdlib;
>> import core.stdc.stdio;
>>
>> alias u64 = ulong;
>> alias i64 = long;
>>
>> struct Vec(T) {
>> private:
>> T* _ptr = null; // The pointer to the data
>> u64 _cap = 0; // Total amount of elements (not bytes) we
>> can store
>> u64 _len = 0;
>>
>> public:
>> /* Create a vector by just allocating memory for it. The
>> null terminator is not set for
>> strings as, the vector is considered empty and we should
>> first push something to it
>> in order to use it! */
>> this(i64 size) {
>> this._len = 0;
>> this._cap = size;
>>
>> static if (is(T == char)) { size += 1; } // Additional
>> space for the null terminator
>> this._ptr = cast(T*)malloc(size);
>> }
>>
>> ref T opIndex(size_t idx) { return _ptr[idx]; }
>> }
>>
>> extern(C)
>> void main()
>> //unittest
>> {
>> enum el = 3;
>> auto vec = Vec!char(10);
>> assert(vec._ptr);
>> vec[el] = 'h';
>> assert(vec[el] == 'h');
>> printf("ptr = %p\n", vec._ptr);
>> printf("vec ptr = %p\n", &vec[el]);
>> printf("vec local = %p\n", &vec);
>> printf("vec[%d] = %c\n", el, vec[el]);
>> foreach (i; 0..vec._cap) {
>> printf("-");
>> }
>> printf("\n");
>> foreach (i; 0..vec._cap) {
>> printf("%d", vec[i]);
>> }
>> printf("\n");
>> printf("run ok\n");
>> }
>> ```
>>
>> ldc2 -betterC -run membug.d
>>
>> output
>>
>> ```
>> ptr = 0x55cb701de2a0
>> vec ptr = 0x55cb701de2a3
>> vec local = 0x7fffa1542258
>> vec[3] = h
>> ----------
>> 000104000000
>> run ok
>> ```
>
> I have made a search on the web and I found out one thread that
> pointed out that it may be a Glibc error. However, because like
> I said the problem only happens when I assign the returned
> value to the `_ptr` field, I just wanted to post here in case
> someone has a similar experience and if it's a compiler bug in
> which case, we should report it.
Did you run this example program above? Does it crash?
More information about the Digitalmars-d-learn
mailing list